Version 1.0, July 2025, SA

This script calculates a weighted average of data clustered together 100% consistently across leave1out iterations, and runs the statistical comparisons for each supercluster.

It plots the supercluster connectivity profiles in Figure 4.

It also runs the statistical analyses and plots for inside vs outside infantile amnesia window comparisons (Figure 5)

Input: threshMat.csv and Hippo_BinxAxis_F_betas.txt

Packages and functions


library(dplyr)
library(stringr)
library(emmeans)
library(ggplot2)
library(nlme)
library(car)
library(Rmisc)

Read in and prepare the data


### specify directory, CHANGE TO YOUR PATH 
dir<-"/Users/audrainsp/Library/CloudStorage/OneDrive-NationalInstitutesofHealth/BabyHippos/R_BabyHippos"

#### read in binarized, thresholded matrix. 
### 1 is where clustering was consistent across all subjects, 0 was inconsistent 
data_threshMat <- read.csv(paste(dir, "/threshMat.csv", sep=""), header = FALSE) 
### get rid of diagonal and lower triangle of the binarized matrix 
diag(data_threshMat)<-0
data_threshMat[lower.tri(data_threshMat)]<-0

### read in our original data and format it for our purposes 
data <- read.table(paste(dir, "/Hippo_BinxAxis_F_betas.txt", sep=""), header = TRUE) 
### keep the top 44 clusters for cluster threshold of 10
data<-subset(data, clust < 45)
## collapse over hem for each subj 
data_ag_hem<-aggregate(data[, "beta"], by=(list(data$subj, data$ax, data$bin, data$clust)), mean)
colnames(data_ag_hem)<-c("subj","ax","bin","clust","beta")

Analyses using leave-one-out cross validation

Selectively average ant and post separately


#### specify which clusters/rois go into each supercluster
supercluster_1<-c(1,6,7,28,34,36,41,43)
supercluster_2<-c(2,3,9,11,13,14,16,19,20,22,24,30,31,32,37,38,40,44)
supercluster_3<-c(4,15,17,23,25,26,29,33,35,39)
supercluster_4<-c(5,10)
supercluster_5<-c(8,12,27,42)
supercluster_6<-c(18,21)

### append supercluster info to our dataframe
data_ag_hem<-mutate(data_ag_hem, supercluster = case_when(clust %in% supercluster_1 ~ 1,
                                                    clust %in% supercluster_2 ~ 2,
                                                    clust %in% supercluster_3 ~ 3,
                                                    clust %in% supercluster_4 ~ 4,
                                                    clust %in% supercluster_5 ~ 5,
                                                    clust %in% supercluster_6 ~ 6))

### loop through to create a column of ages and append to our dataframe
ages<-as.data.frame(c("00mo", "01mo", "02mo", "03mo", "04mo", "05mo", "06mo", "07mo", "08mo", "09mo", "10mo", "11mo", "12mo", "13mo", "14mo", "15mo", "16mo", "17mo", "18mo", "19mo", "20mo", "21mo", "22mo", "23mo", "24mo", "25mo", "26mo"))
colnames(ages)<-c("age")

for (r in 1:nrow(data_ag_hem)){
  for (a in 1:nrow(ages))

  if ((str_detect(data_ag_hem[r,"subj"], pattern = ages[a,])) ==TRUE) {
    data_ag_hem[r,"age"]<-a-1
  } else if ((str_detect(data_ag_hem[r,"subj"], pattern = "00mo"))) {
    data_ag_hem[r,"age"]<-0
  }
}

### initialize some empty lists to append to later, for each supercluster
data_sc_1<-data.frame(matrix(nrow=0, ncol=6))
colnames(data_sc_1)<-c("subj","bin","age","ax","superclust","beta")

data_sc_2<-data.frame(matrix(nrow=0, ncol=6))
colnames(data_sc_2)<-c("subj","bin","age","ax","superclust","beta")

data_sc_3<-data.frame(matrix(nrow=0, ncol=6))
colnames(data_sc_3)<-c("subj","bin","age","ax","superclust","beta")

data_sc_4<-data.frame(matrix(nrow=0, ncol=6))
colnames(data_sc_4)<-c("subj","bin","age","ax","superclust","beta")

data_sc_5<-data.frame(matrix(nrow=0, ncol=6))
colnames(data_sc_5)<-c("subj","bin","age","ax","superclust","beta")

data_sc_6<-data.frame(matrix(nrow=0, ncol=6))
colnames(data_sc_6)<-c("subj","bin","age","ax","superclust","beta")

### loop through matrix and when there is a 1, average the two roi hippo-cortical conn values together
for (r in 1:nrow(data_threshMat)) {

  for (c in 1:ncol(data_threshMat)) {

    if (data_threshMat[r,c]==1){

      #print("yes")

      temp_subset<-subset(data_ag_hem, (clust==r | clust==c))

      ### average across clust
      temp_agg<-aggregate(temp_subset[, "beta"], by=(list(temp_subset$subj,temp_subset$bin, temp_subset$age, temp_subset$ax, temp_subset$supercluster)), mean)
      colnames(temp_agg)<-c("subj","bin","age","ax","superclust","beta")

      if (temp_agg[1,"superclust"]=="1") {
        data_sc_1<-rbind(data_sc_1, temp_agg)
      }

      if (temp_agg[1,"superclust"]=="2") {
        data_sc_2<-rbind(data_sc_2, temp_agg)
      }

      if (temp_agg[1,"superclust"]=="3") {
        data_sc_3<-rbind(data_sc_3, temp_agg)
      }

      if (temp_agg[1,"superclust"]=="4") {
        data_sc_4<-rbind(data_sc_4, temp_agg)
      }

      if (temp_agg[1,"superclust"]=="5") {
        data_sc_5<-rbind(data_sc_5, temp_agg)
      }

      if (temp_agg[1,"superclust"]=="6") {
        data_sc_6<-rbind(data_sc_6, temp_agg)
      }

    }

  }

}

### data for each supercluster weighted by consistency across leave-one-out analysis
data_sc_1<-aggregate(data_sc_1[, "beta"], by=(list(data_sc_1$subj, data_sc_1$bin, data_sc_1$age, data_sc_1$ax)), mean)
colnames(data_sc_1)<-c("subj","bin","age","ax","beta")
data_sc_1$supercluster<-1

data_sc_2<-aggregate(data_sc_2[, "beta"], by=(list(data_sc_2$subj, data_sc_2$bin, data_sc_2$age, data_sc_2$ax)), mean)
colnames(data_sc_2)<-c("subj","bin","age","ax","beta")
data_sc_2$supercluster<-2

data_sc_3<-aggregate(data_sc_3[, "beta"], by=(list(data_sc_3$subj, data_sc_3$bin, data_sc_3$age, data_sc_3$ax)), mean)
colnames(data_sc_3)<-c("subj","bin","age","ax","beta")
data_sc_3$supercluster<-3

## nothing in this one, parahippocampal. Because the ROIs were not clustered together 100% of the time.
# data_sc_4<-aggregate(data_sc_4[, "beta"], by=(list(data_sc_4$subj, data_sc_4$bin)), mean)
# colnames(data_sc_4)<-c("subj","bin","beta")
# data_sc_4$supercluster<-4

data_sc_5<-aggregate(data_sc_5[, "beta"], by=(list(data_sc_5$subj, data_sc_5$bin, data_sc_5$age, data_sc_5$ax)), mean)
colnames(data_sc_5)<-c("subj","bin","age","ax","beta")
data_sc_5$supercluster<-5

data_sc_6<-aggregate(data_sc_6[, "beta"], by=(list(data_sc_6$subj, data_sc_6$bin, data_sc_6$age, data_sc_6$ax)), mean)
colnames(data_sc_6)<-c("subj","bin","age","ax","beta")
data_sc_6$supercluster<-6


#data_LOO<-rbind(data_sc_1,data_sc_2,data_sc_3,data_sc_5,data_sc_6)
data_SC_all<-rbind(data_sc_1, data_sc_2, data_sc_3, data_sc_5, data_sc_6)

Omnibus test across superclusters


### turn variables into factors 
data_SC_all$bin<-as.factor(data_SC_all$bin)
data_SC_all$supercluster<-as.factor(data_SC_all$supercluster)

## model 
## this model takes forever to run, so can also just read a saved version in using readRDS
## model is weighted to allow heteroskedasticity 
#model<-lme(beta ~ ax*bin*supercluster, random= ~1|subj, weights=varIdent(form=~1|bin*ax*supercluster), data=data_SC_all, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) 
model<-readRDS('/Users/audrainsp/Library/CloudStorage/OneDrive-NationalInstitutesofHealth/BabyHippos/R_BabyHippos/GitHub/mod1_weighted_ax_bin_supercluster.rda') ### CHANGE TO YOUR PATH. OR RUN ABOVE MODEL. 

## model diagnostics 
hist(residuals(model))

plot(model)


## stats 
anova(model) 

#### post hocs
## these are the pairwise comparisons used in the manuscript 
## stats for 2 way interactions for each supercluster can be found next to each subplot below 
emmeans(model, list(pairwise ~ ax|bin|supercluster), adjust = "none")
$`emmeans of ax | bin, supercluster`
bin = 1, supercluster = 1:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0667 0.00486 211   0.0572   0.0763
 post 0.0379 0.00500 211   0.0280   0.0477

bin = 2, supercluster = 1:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0642 0.00393 208   0.0564   0.0719
 post 0.0543 0.00406 208   0.0463   0.0623

bin = 3, supercluster = 1:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0660 0.00416 208   0.0578   0.0742
 post 0.0623 0.00407 208   0.0543   0.0703

bin = 4, supercluster = 1:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0458 0.00457 208   0.0368   0.0549
 post 0.0599 0.00450 208   0.0510   0.0687

bin = 1, supercluster = 2:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0432 0.00443 211   0.0345   0.0519
 post 0.0516 0.00482 211   0.0421   0.0611

bin = 2, supercluster = 2:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0332 0.00499 208   0.0233   0.0430
 post 0.0736 0.00494 208   0.0639   0.0834

bin = 3, supercluster = 2:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0298 0.00554 208   0.0189   0.0408
 post 0.0602 0.00491 208   0.0506   0.0699

bin = 4, supercluster = 2:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0335 0.00494 208   0.0238   0.0433
 post 0.0590 0.00481 208   0.0495   0.0685

bin = 1, supercluster = 3:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0697 0.00542 211   0.0590   0.0804
 post 0.0778 0.00528 211   0.0674   0.0882

bin = 2, supercluster = 3:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.1113 0.00517 208   0.1011   0.1214
 post 0.0818 0.00488 208   0.0722   0.0914

bin = 3, supercluster = 3:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.1098 0.00548 208   0.0990   0.1206
 post 0.0851 0.00550 208   0.0743   0.0960

bin = 4, supercluster = 3:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0906 0.00579 208   0.0792   0.1020
 post 0.0808 0.00545 208   0.0700   0.0915

bin = 1, supercluster = 5:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0637 0.00615 211   0.0516   0.0758
 post 0.1031 0.00707 211   0.0892   0.1171

bin = 2, supercluster = 5:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.1132 0.00588 208   0.1016   0.1248
 post 0.1196 0.00572 208   0.1083   0.1309

bin = 3, supercluster = 5:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.1054 0.00492 208   0.0957   0.1151
 post 0.1066 0.00529 208   0.0962   0.1171

bin = 4, supercluster = 5:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.0953 0.00575 208   0.0839   0.1066
 post 0.1047 0.00605 208   0.0928   0.1166

bin = 1, supercluster = 6:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.2451 0.00915 211   0.2271   0.2631
 post 0.1383 0.00657 211   0.1253   0.1512

bin = 2, supercluster = 6:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.2449 0.00735 208   0.2304   0.2594
 post 0.1731 0.00750 208   0.1583   0.1878

bin = 3, supercluster = 6:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.2294 0.00737 208   0.2149   0.2439
 post 0.1647 0.00687 208   0.1511   0.1782

bin = 4, supercluster = 6:
 ax   emmean      SE  df lower.CL upper.CL
 ant  0.1936 0.00909 208   0.1757   0.2115
 post 0.1386 0.00725 208   0.1243   0.1529

Degrees-of-freedom method: containment 
Confidence level used: 0.95 

$`pairwise differences of ax | bin, supercluster`
bin = 1, supercluster = 1:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.02888 0.00437 1872   6.603  <.0001

bin = 2, supercluster = 1:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.00987 0.00263 1872   3.753  0.0002

bin = 3, supercluster = 1:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.00372 0.00291 1872   1.280  0.2006

bin = 4, supercluster = 1:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.01400 0.00288 1872  -4.858  <.0001

bin = 1, supercluster = 2:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.00846 0.00365 1872  -2.321  0.0204

bin = 2, supercluster = 2:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.04049 0.00493 1872  -8.214  <.0001

bin = 3, supercluster = 2:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.03039 0.00541 1872  -5.617  <.0001

bin = 4, supercluster = 2:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.02549 0.00383 1872  -6.647  <.0001

bin = 1, supercluster = 3:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.00812 0.00527 1872  -1.541  0.1235

bin = 2, supercluster = 3:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.02946 0.00505 1872   5.828  <.0001

bin = 3, supercluster = 3:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.02469 0.00590 1872   4.183  <.0001

bin = 4, supercluster = 3:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.00979 0.00552 1872   1.775  0.0761

bin = 1, supercluster = 5:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.03944 0.00763 1872  -5.168  <.0001

bin = 2, supercluster = 5:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.00639 0.00650 1872  -0.983  0.3257

bin = 3, supercluster = 5:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.00128 0.00517 1872  -0.248  0.8039

bin = 4, supercluster = 5:
 3          estimate      SE   df t.ratio p.value
 ant - post -0.00942 0.00608 1872  -1.550  0.1213

bin = 1, supercluster = 6:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.10681 0.00987 1872  10.819  <.0001

bin = 2, supercluster = 6:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.07187 0.00923 1872   7.785  <.0001

bin = 3, supercluster = 6:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.06473 0.00872 1872   7.422  <.0001

bin = 4, supercluster = 6:
 3          estimate      SE   df t.ratio p.value
 ant - post  0.05500 0.01010 1872   5.435  <.0001

Degrees-of-freedom method: containment 
emmeans(model, list(pairwise ~ bin|ax|supercluster), adjust = "none")
$`emmeans of bin | ax, supercluster`
ax = ant, supercluster = 1:
 bin emmean      SE  df lower.CL upper.CL
 1   0.0667 0.00486 211   0.0572   0.0763
 2   0.0642 0.00393 208   0.0564   0.0719
 3   0.0660 0.00416 208   0.0578   0.0742
 4   0.0458 0.00457 208   0.0368   0.0549

ax = post, supercluster = 1:
 bin emmean      SE  df lower.CL upper.CL
 1   0.0379 0.00500 211   0.0280   0.0477
 2   0.0543 0.00406 208   0.0463   0.0623
 3   0.0623 0.00407 208   0.0543   0.0703
 4   0.0599 0.00450 208   0.0510   0.0687

ax = ant, supercluster = 2:
 bin emmean      SE  df lower.CL upper.CL
 1   0.0432 0.00443 211   0.0345   0.0519
 2   0.0332 0.00499 208   0.0233   0.0430
 3   0.0298 0.00554 208   0.0189   0.0408
 4   0.0335 0.00494 208   0.0238   0.0433

ax = post, supercluster = 2:
 bin emmean      SE  df lower.CL upper.CL
 1   0.0516 0.00482 211   0.0421   0.0611
 2   0.0736 0.00494 208   0.0639   0.0834
 3   0.0602 0.00491 208   0.0506   0.0699
 4   0.0590 0.00481 208   0.0495   0.0685

ax = ant, supercluster = 3:
 bin emmean      SE  df lower.CL upper.CL
 1   0.0697 0.00542 211   0.0590   0.0804
 2   0.1113 0.00517 208   0.1011   0.1214
 3   0.1098 0.00548 208   0.0990   0.1206
 4   0.0906 0.00579 208   0.0792   0.1020

ax = post, supercluster = 3:
 bin emmean      SE  df lower.CL upper.CL
 1   0.0778 0.00528 211   0.0674   0.0882
 2   0.0818 0.00488 208   0.0722   0.0914
 3   0.0851 0.00550 208   0.0743   0.0960
 4   0.0808 0.00545 208   0.0700   0.0915

ax = ant, supercluster = 5:
 bin emmean      SE  df lower.CL upper.CL
 1   0.0637 0.00615 211   0.0516   0.0758
 2   0.1132 0.00588 208   0.1016   0.1248
 3   0.1054 0.00492 208   0.0957   0.1151
 4   0.0953 0.00575 208   0.0839   0.1066

ax = post, supercluster = 5:
 bin emmean      SE  df lower.CL upper.CL
 1   0.1031 0.00707 211   0.0892   0.1171
 2   0.1196 0.00572 208   0.1083   0.1309
 3   0.1066 0.00529 208   0.0962   0.1171
 4   0.1047 0.00605 208   0.0928   0.1166

ax = ant, supercluster = 6:
 bin emmean      SE  df lower.CL upper.CL
 1   0.2451 0.00915 211   0.2271   0.2631
 2   0.2449 0.00735 208   0.2304   0.2594
 3   0.2294 0.00737 208   0.2149   0.2439
 4   0.1936 0.00909 208   0.1757   0.2115

ax = post, supercluster = 6:
 bin emmean      SE  df lower.CL upper.CL
 1   0.1383 0.00657 211   0.1253   0.1512
 2   0.1731 0.00750 208   0.1583   0.1878
 3   0.1647 0.00687 208   0.1511   0.1782
 4   0.1386 0.00725 208   0.1243   0.1529

Degrees-of-freedom method: containment 
Confidence level used: 0.95 

$`pairwise differences of bin | ax, supercluster`
ax = ant, supercluster = 1:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2  0.002574 0.00625 208   0.412  0.6809
 bin1 - bin3  0.000707 0.00640 208   0.111  0.9121
 bin1 - bin4  0.020894 0.00667 208   3.133  0.0020
 bin2 - bin3 -0.001867 0.00573 208  -0.326  0.7447
 bin2 - bin4  0.018320 0.00603 208   3.039  0.0027
 bin3 - bin4  0.020187 0.00618 208   3.267  0.0013

ax = post, supercluster = 1:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.016433 0.00644 208  -2.551  0.0115
 bin1 - bin3 -0.024447 0.00645 208  -3.789  0.0002
 bin1 - bin4 -0.021989 0.00673 208  -3.268  0.0013
 bin2 - bin3 -0.008014 0.00575 208  -1.394  0.1648
 bin2 - bin4 -0.005557 0.00606 208  -0.917  0.3600
 bin3 - bin4  0.002458 0.00607 208   0.405  0.6859

ax = ant, supercluster = 2:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2  0.010028 0.00667 208   1.504  0.1341
 bin1 - bin3  0.013335 0.00709 208   1.881  0.0613
 bin1 - bin4  0.009667 0.00663 208   1.458  0.1464
 bin2 - bin3  0.003306 0.00745 208   0.444  0.6577
 bin2 - bin4 -0.000361 0.00702 208  -0.052  0.9590
 bin3 - bin4 -0.003668 0.00742 208  -0.494  0.6216

ax = post, supercluster = 2:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.021998 0.00690 208  -3.187  0.0017
 bin1 - bin3 -0.008597 0.00688 208  -1.250  0.2126
 bin1 - bin4 -0.007362 0.00681 208  -1.082  0.2806
 bin2 - bin3  0.013401 0.00696 208   1.924  0.0557
 bin2 - bin4  0.014636 0.00690 208   2.122  0.0350
 bin3 - bin4  0.001235 0.00687 208   0.180  0.8575

ax = ant, supercluster = 3:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.041533 0.00749 208  -5.546  <.0001
 bin1 - bin3 -0.040109 0.00771 208  -5.205  <.0001
 bin1 - bin4 -0.020849 0.00793 208  -2.630  0.0092
 bin2 - bin3  0.001425 0.00753 208   0.189  0.8501
 bin2 - bin4  0.020685 0.00776 208   2.666  0.0083
 bin3 - bin4  0.019260 0.00797 208   2.417  0.0165

ax = post, supercluster = 3:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.003959 0.00719 208  -0.551  0.5826
 bin1 - bin3 -0.007300 0.00763 208  -0.957  0.3395
 bin1 - bin4 -0.002946 0.00759 208  -0.388  0.6983
 bin2 - bin3 -0.003341 0.00736 208  -0.454  0.6502
 bin2 - bin4  0.001013 0.00732 208   0.138  0.8901
 bin3 - bin4  0.004354 0.00775 208   0.562  0.5747

ax = ant, supercluster = 5:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.049474 0.00851 208  -5.817  <.0001
 bin1 - bin3 -0.041650 0.00788 208  -5.289  <.0001
 bin1 - bin4 -0.031583 0.00842 208  -3.752  0.0002
 bin2 - bin3  0.007824 0.00767 208   1.021  0.3086
 bin2 - bin4  0.017890 0.00822 208   2.176  0.0307
 bin3 - bin4  0.010067 0.00757 208   1.330  0.1850

ax = post, supercluster = 5:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.016425 0.00909 208  -1.806  0.0724
 bin1 - bin3 -0.003492 0.00883 208  -0.396  0.6928
 bin1 - bin4 -0.001561 0.00931 208  -0.168  0.8670
 bin2 - bin3  0.012932 0.00779 208   1.659  0.0985
 bin2 - bin4  0.014864 0.00833 208   1.784  0.0759
 bin3 - bin4  0.001931 0.00804 208   0.240  0.8104

ax = ant, supercluster = 6:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2  0.000161 0.01170 208   0.014  0.9891
 bin1 - bin3  0.015677 0.01170 208   1.334  0.1836
 bin1 - bin4  0.051511 0.01290 208   3.994  0.0001
 bin2 - bin3  0.015516 0.01040 208   1.491  0.1375
 bin2 - bin4  0.051350 0.01170 208   4.394  <.0001
 bin3 - bin4  0.035835 0.01170 208   3.063  0.0025

ax = post, supercluster = 6:
 3            estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.034779 0.00997 208  -3.488  0.0006
 bin1 - bin3 -0.026401 0.00951 208  -2.776  0.0060
 bin1 - bin4 -0.000294 0.00979 208  -0.030  0.9761
 bin2 - bin3  0.008378 0.01020 208   0.824  0.4110
 bin2 - bin4  0.034486 0.01040 208   3.305  0.0011
 bin3 - bin4  0.026108 0.00999 208   2.613  0.0096

Degrees-of-freedom method: containment 
### save the output, if desired 
# capture.output(emmeans(model, list(pairwise ~ bin|ax|supercluster), adjust = "fdr"), file="/Users/samanthaaudrain/Documents/Science_Projects/BabyHippos/R_BabyHippos/mod2_weighted_ax_bin_supercluster_emmeans1_fdr.doc")
# 
# capture.output(emmeans(model, list(pairwise ~ ax|bin|supercluster), adjust = "fdr"), file="/Users/samanthaaudrain/Documents/Science_Projects/BabyHippos/R_BabyHippos/mod2_weighted_ax_bin_supercluster_emmeans2_fdr.doc")

Models and Plots

Cingulo-opercular supercluster


## prepare the data 
data_SC<-data_sc_1 ### this is weighted averaged data across component clusters 
data_SC$bin<-as.factor(data_SC$bin)

## run the model 
model<-lme(beta ~ ax*bin, random= ~1|subj, weights=varIdent(form=~1|bin), data=data_SC, na.action=na.omit)

## model diagnostics 
# hist(residuals(model))
# plot(model)

# stats
anova(model) 

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("bin","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/cing_operc.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(stats, aes(x=bin, y=beta, group=ax)) + 
  geom_line(size=1, aes(linetype="solid", color=ax)) +
  geom_errorbar(width = .0, aes(ymin=lower_se, ymax=upper_se)) +
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_x_discrete(limits=c("1", "2", "3", "4"), labels=c("0-6", "7-12", "13-18","19-25"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_color_manual(values=c('#152370','#6577a1')) +
  geom_hline(yintercept=0)+
  # ggtitle("cingulo-opercular
  # supercluster")+
  labs(x="age", y="connectivity", color="hippocampal axis")

#dev.off()

#ggsave("cingulo-operc.png", path="~/Downloads", width = 4.5, height = 4)

Dorsal frontal parietal supercluster


## prepare the data 
data_SC<-data_sc_2 ### this is weighted averaged data across component clusters 
data_SC$bin<-as.factor(data_SC$bin)

## run the model 
model<-lme(beta ~ ax*bin, random= ~1|subj, data=data_SC, na.action=na.omit)

## model diagnostics 
# hist(residuals(model))
# plot(model)

## stats 
anova(model) 

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("bin","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/dFPN.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(stats, aes(x=bin, y=beta, group=ax)) + 
  geom_line(size=1, aes(linetype="solid", color=ax)) +
  geom_errorbar(width = .0, aes(ymin=lower_se, ymax=upper_se)) +
  theme_classic() +
     theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_x_discrete(limits=c("1", "2", "3", "4"), labels=c("0-6", "7-12", "13-18","19-25"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_color_manual(values=c('#4bf52a','#bdf7b2')) +
  geom_hline(yintercept=0)+
  # ggtitle("dorsal frontal parietal
  # supercluster")+
  labs(x="age", y="connectivity", color="hippocampal axis")

#dev.off()

#ggsave("dorsalFPN.png", path="~/Downloads", width = 4.5, height = 4)

mPFC-STS supercluster


## prepare the data 
data_SC<-data_sc_3 ### this is weighted averaged data across component clusters 
data_SC$bin<-as.factor(data_SC$bin)

## run the model 
model<-lme(beta ~ ax*bin, random= ~1|subj, data=data_SC, na.action=na.omit)

## model diagnostics 
# hist(residuals(model))
# plot(model)

## stats 
anova(model) 

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("bin","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/mPFCSTS.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(stats, aes(x=bin, y=beta, group=ax)) + 
  geom_line(size=1, aes(linetype="solid", color=ax)) +
  geom_errorbar(width = .0, aes(ymin=lower_se, ymax=upper_se)) +
  theme_classic() +
   theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_x_discrete(limits=c("1", "2", "3", "4"), labels=c("0-6", "7-12", "13-18","19-25"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_color_manual(values=c('#f2f207','#fafab4')) +
  geom_hline(yintercept=0)+
  # ggtitle("vmPFC-STS
  # supercluster")+
  labs(x="age", y="connectivity", color="hippocampal axis")

#dev.off()

#ggsave("vmpfc_sts.png", path="~/Downloads", width = 4.5, height = 4)

Medial parietal supercluster


## prepare the data 
data_SC<-data_sc_5 ### this is weighted averaged data across component clusters 
data_SC$bin<-as.factor(data_SC$bin)

## run the model 
model<-lme(beta ~ ax*bin, random= ~1|subj, data=data_SC, na.action=na.omit)

## model diagnostics 
# hist(residuals(model))
# plot(model)

## stats 
anova(model) 

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("bin","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/parietal.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(stats, aes(x=bin, y=beta, group=ax)) + 
  geom_line(size=1, aes(linetype="solid", color=ax)) +
  geom_errorbar(width = .0, aes(ymin=lower_se, ymax=upper_se)) +
  theme_classic() +
   theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_x_discrete(limits=c("1", "2", "3", "4"), labels=c("0-6", "7-12", "13-18","19-25"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_color_manual(values=c('#fa750f','#faa666')) +
  geom_hline(yintercept=0)+
  # ggtitle("medial parietal
  # supercluster")+
  labs(x="age", y="connectivity", color="hippocampal axis")

#dev.off()

#ggsave("medialparietal.png", path="~/Downloads", width = 4.5, height = 4)

Entorhinal supercluster


## prepare the data 
data_SC<-data_sc_6 ### this is weighted averaged data across component clusters 
data_SC$bin<-as.factor(data_SC$bin)

## run the model 
model<-lme(beta ~ ax*bin, random= ~1|subj, data=data_SC, na.action=na.omit)

## model diagnostics 
# hist(residuals(model))
# plot(model)

## stats 
anova(model) 

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("bin","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/EC.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(stats, aes(x=bin, y=beta, group=ax)) + 
  geom_line(size=1, aes(linetype="solid", color=ax)) +
  geom_errorbar(width = .0, aes(ymin=lower_se, ymax=upper_se)) +
  theme_classic() +
   theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_x_discrete(limits=c("1", "2", "3", "4"), labels=c("0-6", "7-12", "13-18","19-25"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_color_manual(values=c('#28fcfc','#bfffff')) +
  geom_hline(yintercept=0)+
  # ggtitle("entorhinal
  # supercluster")+
  labs(x="age", y="connectivity", color="hippocampal axis")

#dev.off()

#ggsave("entorhinal.png", path="~/Downloads", width = 4.5, height = 4)

LOESS plots to visualize continuous data

Plotting anterior and posterior data separately and overlaid for best visualization

Cingulo-opercular supercluster


SC_data<-subset(data_sc_1, supercluster==1 & ax=="ant")

#tiff("~/Downloads/CP_1.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) + 
  geom_smooth(method="loess", level=0.95, col="#152370") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("cingulo-operc_ant.png", path="~/Downloads", width = 4.5, height = 4)


SC_data<-subset(data_sc_1, supercluster==1 & ax=="post")

#tiff("~/Downloads/CP_2.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) + 
  geom_smooth(method="loess", level=0.95, col="#6577a1") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("cingulo-operc_post.png", path="~/Downloads", width = 4.5, height = 4)



### both plots overlaid 
SC_data<-subset(data_sc_1, supercluster==1)

#tiff("~/Downloads/CP_3.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age, group=ax, color=ax)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_smooth(method="loess", level=0.95) + 
  scale_color_manual(values=c("#152370","#6577a1"))+
  theme_classic() +
 theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("cingulo-operc_antpost.png", path="~/Downloads", width = 4.5, height = 4)

Dorsal frontal parietal supercluster

SC_data<-subset(data_sc_2, supercluster==2 & ax=="ant")

#tiff("~/Downloads/FPN_1.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) +  
  geom_smooth(method="loess", level=0.95, col="#4bf52a") + 
  theme_classic() +
 theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("DFP_ant_younger.png", path="~/Downloads", width = 4.5, height = 4)



SC_data<-subset(data_sc_2, supercluster==2 & ax=="post")

#tiff("~/Downloads/FPN_2.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) +  
  geom_smooth(method="loess", level=0.95, col="#a2f792") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("DFP_post_younger.png", path="~/Downloads", width = 4.5, height = 4)


SC_data<-subset(data_sc_2, supercluster==2)

#tiff("~/Downloads/FPN_3.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age, group=ax, color=ax)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_smooth(method="loess", level=0.95) + 
  scale_color_manual(values=c("#4bf52a","#bdf7b2"))+
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("DFP_antpost.png", path="~/Downloads", width = 4.5, height = 4)

mPFC-STS supercluster


SC_data<-subset(data_sc_3, supercluster==3 & ax=="ant")

#tiff("~/Downloads/STS_1.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) +  
  geom_smooth(method="loess", level=0.95, col="#f2f207") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("mPFC_ant_younger.png", path="~/Downloads", width = 4.5, height = 4)


SC_data<-subset(data_sc_3, supercluster==3 & ax=="post")

#tiff("~/Downloads/STS_2.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) +  
  geom_smooth(method="loess", level=0.95, col="#fafab4") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("mPFC_post_younger.png", path="~/Downloads", width = 4.5, height = 4)



SC_data<-subset(data_sc_3, supercluster==3)

#tiff("~/Downloads/STS_3.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age, group=ax, color=ax)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_smooth(method="loess", level=0.95) + 
  scale_color_manual(values=c("#f2f207","#fafab4"))+
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("mPFC_antpost.png", path="~/Downloads", width = 4.5, height = 4)

Medial parietal supercluster


SC_data<-subset(data_sc_5, supercluster==5 & ax=="ant")

#tiff("~/Downloads/parietal_1.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) + 
  geom_smooth(method="loess", level=0.95, col="#fa750f") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("parietal_ant_younger.png", path="~/Downloads", width = 4.5, height = 4)


SC_data<-subset(data_sc_5, supercluster==5 & ax=="post")

#tiff("~/Downloads/parietal_2.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) + 
  geom_smooth(method="loess", level=0.95, col="#faa666") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("parietal_post_younger.png", path="~/Downloads", width = 4.5, height = 4)



SC_data<-subset(data_sc_5, supercluster==5)

#tiff("~/Downloads/parietal_3.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age, group=ax, color=ax)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_smooth(method="loess", level=0.95) + 
  scale_color_manual(values=c("#fa750f","#faa666"))+
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("parietal_antpost.png", path="~/Downloads", width = 4.5, height = 4)

Entorhinal supercluster


SC_data<-subset(data_sc_6, supercluster==6 & ax=="ant")

#tiff("~/Downloads/EC_1.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) + 
  geom_smooth(method="loess", level=0.95, col="#28fcfc") + 
  theme_classic() +
 theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("entorhinal_ant_younger.png", path="~/Downloads", width = 4.5, height = 4)




SC_data<-subset(data_sc_6, supercluster==6 & ax=="post")

#tiff("~/Downloads/EC_2.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) + 
  geom_smooth(method="loess", level=0.95, col="#bfffff") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("entorhinal_post_younger.png", path="~/Downloads", width = 4.5, height = 4)


SC_data<-subset(data_sc_6, supercluster==6)

#tiff("~/Downloads/EC_3.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(SC_data, aes(y=beta, x=age, group=ax, color=ax)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_smooth(method="loess", level=0.95) + 
  scale_color_manual(values=c("#28fcfc","#bfffff"))+
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("entorhinal_antpost.png", path="~/Downloads", width = 4.5, height = 4)

Analyses without using leave-one-out cross validation

Parahippocampal Supercluster

As the parahippocampal supercluster was the only one that did not show 100% clustering consistency, we cannot do selective averaging here. So just plot the raw data to see what it looks like. This is not corrected for subject-level bias as the other superclusters are.

Models and plot


## define the parahippocampal supercluster 
data_SC<-subset(data_ag_hem, supercluster=="4") 

## next collapse over clusters
data_SC<-aggregate(data_SC[, "beta"], by=(list(data_SC$subj, data_SC$ax, data_SC$bin)), mean)
colnames(data_SC)<-c("subj","ax","bin","beta")

## make a factor 
data_SC$bin<-as.factor(data_SC$bin)

## model it 
model<-lme(beta ~ ax*bin, random= ~1|subj, data=data_SC, na.action=na.omit, weights=varIdent(form=~1|bin), control = lmeControl(msMaxIter=1000, msMaxEval=1000))

## model diagnostics 
# hist(residuals(model))
# plot(model)

## stats
anova(model) 

## posthocs 
emmeans(model, list(pairwise ~ ax|bin), adjust = "fdr")
$`emmeans of ax | bin`
bin = 1:
 ax   emmean      SE  df lower.CL upper.CL
 ant   0.129 0.00695 211    0.115    0.143
 post  0.222 0.00695 208    0.209    0.236

bin = 2:
 ax   emmean      SE  df lower.CL upper.CL
 ant   0.168 0.00592 208    0.156    0.179
 post  0.207 0.00592 208    0.195    0.218

bin = 3:
 ax   emmean      SE  df lower.CL upper.CL
 ant   0.169 0.00580 208    0.158    0.180
 post  0.204 0.00580 208    0.193    0.216

bin = 4:
 ax   emmean      SE  df lower.CL upper.CL
 ant   0.145 0.00654 208    0.133    0.158
 post  0.177 0.00654 208    0.164    0.190

Degrees-of-freedom method: containment 
Confidence level used: 0.95 

$`pairwise differences of ax | bin`
bin = 1:
 2          estimate      SE  df t.ratio p.value
 ant - post  -0.0933 0.00583 208 -16.000  <.0001

bin = 2:
 2          estimate      SE  df t.ratio p.value
 ant - post  -0.0392 0.00411 208  -9.535  <.0001

bin = 3:
 2          estimate      SE  df t.ratio p.value
 ant - post  -0.0351 0.00362 208  -9.678  <.0001

bin = 4:
 2          estimate      SE  df t.ratio p.value
 ant - post  -0.0318 0.00397 208  -8.013  <.0001

Degrees-of-freedom method: containment 
emmeans(model, list(pairwise ~ bin|ax), adjust = "fdr")
$`emmeans of bin | ax`
ax = ant:
 bin emmean      SE  df lower.CL upper.CL
 1    0.129 0.00695 211    0.115    0.143
 2    0.168 0.00592 208    0.156    0.179
 3    0.169 0.00580 208    0.158    0.180
 4    0.145 0.00654 208    0.133    0.158

ax = post:
 bin emmean      SE  df lower.CL upper.CL
 1    0.222 0.00695 208    0.209    0.236
 2    0.207 0.00592 208    0.195    0.218
 3    0.204 0.00580 208    0.193    0.216
 4    0.177 0.00654 208    0.164    0.190

Degrees-of-freedom method: containment 
Confidence level used: 0.95 

$`pairwise differences of bin | ax`
ax = ant:
 2           estimate      SE  df t.ratio p.value
 bin1 - bin2 -0.03837 0.00913 208  -4.203  0.0001
 bin1 - bin3 -0.03984 0.00905 208  -4.401  0.0001
 bin1 - bin4 -0.01622 0.00954 208  -1.700  0.1087
 bin2 - bin3 -0.00146 0.00828 208  -0.177  0.8601
 bin2 - bin4  0.02215 0.00882 208   2.512  0.0191
 bin3 - bin4  0.02361 0.00873 208   2.703  0.0149

ax = post:
 2           estimate      SE  df t.ratio p.value
 bin1 - bin2  0.01569 0.00913 208   1.719  0.1045
 bin1 - bin3  0.01837 0.00905 208   2.029  0.0656
 bin1 - bin4  0.04525 0.00954 208   4.742  <.0001
 bin2 - bin3  0.00267 0.00828 208   0.323  0.7472
 bin2 - bin4  0.02955 0.00882 208   3.352  0.0029
 bin3 - bin4  0.02688 0.00873 208   3.077  0.0047

Degrees-of-freedom method: containment 
P value adjustment: fdr method for 6 tests 
## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("bin","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot 
#tiff("~/Downloads/test.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(stats, aes(x=bin, y=beta, group=ax)) + 
  geom_line(size=1, aes(linetype="solid", color=ax)) +
  geom_errorbar(width = .0, aes(ymin=lower_se, ymax=upper_se)) +
  theme_classic() +
  theme(axis.title = element_text(size=24), axis.ticks.x=element_blank(), axis.text=element_text(size=18),
  plot.title = element_text(size=26, face="bold", hjust=0.5), legend.position="bottom") +
    theme(text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_x_discrete(limits=c("1", "2", "3", "4"), labels=c("0-6", "7-12", "13-18","19-25"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_color_manual(values=c('#f5200c','#fc9288')) +
  geom_hline(yintercept=0)+
  # ggtitle("parahippocampal
  # supercluster")+
  labs(x="age (months)", y="connectivity", color="hippocampal axis")

#dev.off()
#ggsave("parahippocampal.png", path="~/Downloads", width = 4.5, height = 4)

LOESS continuous plots


## subset 
data_SC<-subset(data_ag_hem, supercluster=="4" & ax == "ant") ## it's made up of clusters 5 and 10 

## next collapse over clusters
data_SC<-aggregate(data_SC[, "beta"], by=(list(data_SC$subj, data_SC$ax, data_SC$age, data_SC$supercluster)), mean)
colnames(data_SC)<-c("subj","ax", "age", "supercluster","beta")

## plot 
#tiff("~/Downloads/PH_1.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(data_SC, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) +  
  geom_smooth(method="loess", level=0.95, col="#f5200c") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

##dev.off()
#ggsave("parahip_ant_younger.png", path="~/Downloads", width = 4.5, height = 4)



data_SC<-subset(data_ag_hem, supercluster==4 & ax=="post")

#tiff("~/Downloads/PH_2.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(data_SC, aes(y=beta, x=age)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_point(size=2, alpha=0.7) +  
  geom_smooth(method="loess", level=0.95, col="#fc9288") + 
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("parahip_post_younger.png", path="~/Downloads", width = 4.5, height = 4)



### both plots overlaid 
data_SC<-subset(data_ag_hem, supercluster==4)

#tiff("~/Downloads/PH_3.tiff", units="in", width=4.5, height=4, res=1000)
ggplot(data_SC, aes(y=beta, x=age, group=ax, color=ax)) + 
  geom_vline(xintercept = 6, color="grey", linetype="solid") +
  geom_vline(xintercept = 12, color="grey", linetype="solid") +
  geom_vline(xintercept = 18, color="grey", linetype="solid") +
  geom_vline(xintercept = 25, color="grey", linetype="solid") +
  geom_smooth(method="loess", level=0.95) + 
  scale_color_manual(values=c("#f5200c","#fc9288"))+
  theme_classic() +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=20), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  scale_shape_manual(values=c(20))+
  guides(shape = FALSE, size = FALSE)+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  scale_x_continuous(expand = c(0, 0), limits = c(0,26), breaks=seq(0,26,5))+
  labs(y = "connectivity (Fisher z)",
       x = "age (months)",
       title = "")

#dev.off()
#ggsave("parahip_antpost.png", path="~/Downloads", width = 4.5, height = 4)

Compare hippocampal-supercluster connectivity between toddlers and older children

Comparing connectivity of the anterior and posterior hippocampus to each supercluster, between the oldest age bin within the infantile amnesia window (~1.5-2 years old) and children just outside of it (3-6 years)

Read in and prepare the data

## read in the data, CHANGE PATHS HERE 
dir<-"/Users/samanthaaudrain/Documents/Science_Projects/BabyHippos/R_BabyHippos"
dir<-"/Users/audrainsp/Library/CloudStorage/OneDrive-NationalInstitutesofHealth/BabyHippos/R_BabyHippos"
data2 <- read.table(paste(dir, "/supercluster_antpost_betas_by_age.txt", sep=""), header = TRUE)
data2<- subset(data2, age > 35)
data2$bin<-"5"

## change roi label from ant_hippo to ant and post to be consistent with other data 
data2<-mutate(data2, ax= case_when(roi=="ant_hippo" ~ "ant",
                                        roi=="post_hippo"~ "post"))

## collapse over hem for each subj 
data2_agg<-aggregate(data2[, "beta"], by=(list(data2$subj, data2$bin, data2$age, data2$ax, data2$supercluster)), mean)
colnames(data2_agg)<-c("subj","bin","age","ax","supercluster","beta")

## reorder 
data2_agg<-as.data.frame(cbind(data2_agg$subj, data2_agg$bin, data2_agg$age, data2_agg$ax, data2_agg$beta, data2_agg$supercluster))
colnames(data2_agg)<-c("subj","bin","age","ax","beta","supercluster")

## remove parahip cluster which doesnt have LOO data to compare to 
data2_agg_nosc4<-subset(data2_agg, supercluster != 4)

## combine original LOO dataset with the data from the older kids 
data_LOO<-rbind(data_SC_all, data2_agg_nosc4) 

## make age numeric and subset the data to be just the oldest age bin within infantile amnesia window + the older kids 
data_LOO$age<-as.numeric(data_LOO$age)
data_LOO<-subset(data_LOO, ((age>18 & age<26) | age>35))

## specify other variables as factors or numeric 
data_LOO$supercluster<-as.factor(data_LOO$supercluster)
data_LOO$beta <- as.numeric(data_LOO$beta)

## create labels for inside and outside infantile amnesia window 
data_LOO<-data_LOO %>%
  mutate(amnesia=case_when(age<26 ~ "inside",
                      age>35 ~ "outside"))

Omnibus


## model
model<- lme((beta) ~ ax*amnesia*supercluster, random=~supercluster|subj, weights=varIdent(form=~1|supercluster), data=data_LOO, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) 
## modeled heteroskedasticity 

## model diagnostics 
hist(residuals(model))

plot(model) 


## stats
anova(model)

## post-hocs 
emmeans(model, list(pairwise ~ amnesia | supercluster), adjust = "fdr")
NOTE: Results may be misleading due to involvement in interactions
$`emmeans of amnesia | supercluster`
supercluster = 1:
 amnesia emmean      SE df lower.CL upper.CL
 inside  0.0529 0.00526 73   0.0424   0.0633
 outside 0.1298 0.00655 72   0.1168   0.1429

supercluster = 2:
 amnesia emmean      SE df lower.CL upper.CL
 inside  0.0463 0.00624 73   0.0338   0.0587
 outside 0.0867 0.00777 72   0.0712   0.1022

supercluster = 3:
 amnesia emmean      SE df lower.CL upper.CL
 inside  0.0857 0.00685 73   0.0720   0.0993
 outside 0.1064 0.00853 72   0.0894   0.1234

supercluster = 5:
 amnesia emmean      SE df lower.CL upper.CL
 inside  0.1000 0.00635 73   0.0873   0.1127
 outside 0.1607 0.00792 72   0.1449   0.1764

supercluster = 6:
 amnesia emmean      SE df lower.CL upper.CL
 inside  0.1661 0.00732 73   0.1515   0.1807
 outside 0.1606 0.00912 72   0.1424   0.1788

Results are averaged over the levels of: ax 
Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of amnesia | supercluster`
supercluster = 1:
 2                estimate      SE df t.ratio p.value
 inside - outside -0.07697 0.00840 72  -9.162  <.0001

supercluster = 2:
 2                estimate      SE df t.ratio p.value
 inside - outside -0.04046 0.00997 72  -4.060  0.0001

supercluster = 3:
 2                estimate      SE df t.ratio p.value
 inside - outside -0.02074 0.01090 72  -1.896  0.0620

supercluster = 5:
 2                estimate      SE df t.ratio p.value
 inside - outside -0.06067 0.01020 72  -5.977  <.0001

supercluster = 6:
 2                estimate      SE df t.ratio p.value
 inside - outside  0.00548 0.01170 72   0.469  0.6407

Results are averaged over the levels of: ax 
Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
emmeans(model, list(pairwise ~ ax*supercluster), adjust = "fdr")
NOTE: Results may be misleading due to involvement in interactions
$`emmeans of ax, supercluster`
 ax   supercluster emmean      SE df lower.CL upper.CL
 ant  1            0.0832 0.00438 72   0.0745   0.0920
 post 1            0.0994 0.00438 72   0.0907   0.1082
 ant  2            0.0543 0.00514 72   0.0441   0.0646
 post 2            0.0787 0.00514 72   0.0684   0.0889
 ant  3            0.0987 0.00569 72   0.0874   0.1101
 post 3            0.0933 0.00569 72   0.0820   0.1047
 ant  5            0.1236 0.00547 72   0.1127   0.1345
 post 5            0.1371 0.00547 72   0.1262   0.1480
 ant  6            0.1891 0.00644 72   0.1763   0.2020
 post 6            0.1376 0.00644 72   0.1247   0.1504

Results are averaged over the levels of: amnesia 
Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of ax, supercluster`
 1                                        estimate      SE  df t.ratio p.value
 ant supercluster1 - post supercluster1  -0.016170 0.00249 648  -6.485  <.0001
 ant supercluster1 - ant supercluster2    0.028917 0.00335 648   8.635  <.0001
 ant supercluster1 - post supercluster2   0.004599 0.00335 648   1.373  0.1823
 ant supercluster1 - ant supercluster3   -0.015495 0.00454 648  -3.412  0.0009
 ant supercluster1 - post supercluster3  -0.010096 0.00454 648  -2.223  0.0298
 ant supercluster1 - ant supercluster5   -0.040308 0.00467 648  -8.625  <.0001
 ant supercluster1 - post supercluster5  -0.053852 0.00467 648 -11.523  <.0001
 ant supercluster1 - ant supercluster6   -0.105876 0.00569 648 -18.602  <.0001
 ant supercluster1 - post supercluster6  -0.054306 0.00569 648  -9.542  <.0001
 post supercluster1 - ant supercluster2   0.045087 0.00335 648  13.464  <.0001
 post supercluster1 - post supercluster2  0.020769 0.00335 648   6.202  <.0001
 post supercluster1 - ant supercluster3   0.000675 0.00454 648   0.149  0.9019
 post supercluster1 - post supercluster3  0.006074 0.00454 648   1.338  0.1899
 post supercluster1 - ant supercluster5  -0.024138 0.00467 648  -5.165  <.0001
 post supercluster1 - post supercluster5 -0.037682 0.00467 648  -8.063  <.0001
 post supercluster1 - ant supercluster6  -0.089705 0.00569 648 -15.761  <.0001
 post supercluster1 - post supercluster6 -0.038136 0.00569 648  -6.700  <.0001
 ant supercluster2 - post supercluster2  -0.024318 0.00253 648  -9.610  <.0001
 ant supercluster2 - ant supercluster3   -0.044412 0.00442 648 -10.047  <.0001
 ant supercluster2 - post supercluster3  -0.039013 0.00442 648  -8.826  <.0001
 ant supercluster2 - ant supercluster5   -0.069226 0.00485 648 -14.282  <.0001
 ant supercluster2 - post supercluster5  -0.082769 0.00485 648 -17.076  <.0001
 ant supercluster2 - ant supercluster6   -0.134793 0.00615 648 -21.926  <.0001
 ant supercluster2 - post supercluster6  -0.083224 0.00615 648 -13.537  <.0001
 post supercluster2 - ant supercluster3  -0.020094 0.00442 648  -4.546  <.0001
 post supercluster2 - post supercluster3 -0.014695 0.00442 648  -3.324  0.0011
 post supercluster2 - ant supercluster5  -0.044907 0.00485 648  -9.265  <.0001
 post supercluster2 - post supercluster5 -0.058451 0.00485 648 -12.059  <.0001
 post supercluster2 - ant supercluster6  -0.110475 0.00615 648 -17.970  <.0001
 post supercluster2 - post supercluster6 -0.058905 0.00615 648  -9.582  <.0001
 ant supercluster3 - post supercluster3   0.005399 0.00313 648   1.723  0.0937
 ant supercluster3 - ant supercluster5   -0.024813 0.00518 648  -4.786  <.0001
 ant supercluster3 - post supercluster5  -0.038357 0.00518 648  -7.399  <.0001
 ant supercluster3 - ant supercluster6   -0.090380 0.00630 648 -14.341  <.0001
 ant supercluster3 - post supercluster6  -0.038811 0.00630 648  -6.158  <.0001
 post supercluster3 - ant supercluster5  -0.030212 0.00518 648  -5.828  <.0001
 post supercluster3 - post supercluster5 -0.043756 0.00518 648  -8.440  <.0001
 post supercluster3 - ant supercluster6  -0.095779 0.00630 648 -15.198  <.0001
 post supercluster3 - post supercluster6 -0.044210 0.00630 648  -7.015  <.0001
 ant supercluster5 - post supercluster5  -0.013544 0.00407 648  -3.330  0.0011
 ant supercluster5 - ant supercluster6   -0.065567 0.00616 648 -10.645  <.0001
 ant supercluster5 - post supercluster6  -0.013998 0.00616 648  -2.273  0.0270
 post supercluster5 - ant supercluster6  -0.052024 0.00616 648  -8.446  <.0001
 post supercluster5 - post supercluster6 -0.000454 0.00616 648  -0.074  0.9412
 ant supercluster6 - post supercluster6   0.051569 0.00537 648   9.601  <.0001

Results are averaged over the levels of: amnesia 
Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
P value adjustment: fdr method for 45 tests 

Other models we tried and compared

The model above was the best fit and had the best diagnostics, these weren’t used in the end

# anova(model2,model)
# model<-lme((beta) ~ ax*amnesia*supercluster, random=~supercluster*amnesia|subj, weights=varIdent(form=~1|supercluster), data=data_ag_hem, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) ## doesnt do better than version where just have supercluster random slope. cant have 3 way random slope. 
# model<-lme(beta ~ ax*amnesia*supercluster, random=~1|subj, weights=varIdent(form=~1|amnesia*ax*supercluster), data=data_ag_hem, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) ## original model, heteroskedastic and nonlinear and not normal
# model<-lme(beta ~ ax*amnesia*supercluster, random=~1|subj, weights=varIdent(form=~fitted(.)), data=data_ag_hem, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) ## models variance as a function of the fitted values, didnt help 
# model<-lme(sqrt(beta+1) ~ ax*amnesia*supercluster, random=~1|subj, data=data_ag_hem, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) ## squrt transform to help with skew didnt help 
# model<-lme(log(beta+1) ~ ax*amnesia*supercluster, random=~1|subj, data=data_ag_hem, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) ### log to help with skew didn thelp 
# model<-lme(beta ~ ax*amnesia*supercluster, random=~supercluster|subj, data=data_ag_hem, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit) ## this one helped, adding a random slope for supercluster. But still supercluster a bit heteroskedastic, try adding weights 


### diagnostics checked 
# ## residuals should be normally distributed
# hist(residuals(model))
# ##check for homogeneity of variance
# plot(model) #should look fairly uniform and random
# leveneTest(residuals(model) ~ data_SC$ax)
# leveneTest(residuals(model) ~ data_SC$amnesia)
# shapiro.test(resid(model))
# icc(model)
# ## A high ICC suggests that subjects account for a large proportion of variance in beta, meaning subject-level variation is important to model (random intercept for subject). ICC>.2 justifies using a random intercept, if greater than .5 most of the variance is due to subject differences and a mixed model is crucial. If ICC is moderate 0.05-.2 a random intercept model is fine, if ICC is greater than .2 should consider addign random slopes if suspect effect of fixed effects varies by subject. Want to use adjusted ICC. 
# AIC(model,model2) ## lower, more neg is better 
# ## check variance structure of each level of amnesia 
# plot(fitted(model), resid(model), 
#      col=as.numeric(as.factor(data_SC$amnesia)),  # Convert factor to numeric for colors
#      pch=19)
# abline(h=0, lty=2)
# ## if residuals look unequal, variance structure is needed
# boxplot(resid(model) ~ amnesia, data=data_SC)

2 way interactions

## next break down model into 2 way interaction. i.e. ax by amnesia for each supercluster 
## these models were the best fits after some model comparisons 

data_SC<-subset(data_LOO, supercluster=="1")
model<- lme((beta) ~ ax*amnesia, random=~amnesia|subj,  weights=varIdent(form=~1|ax), data=data_SC, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit)
anova(model)
emmeans(model, list(pairwise ~ amnesia*ax), adjust = "fdr")
$`emmeans of amnesia, ax`
 amnesia ax   emmean      SE df lower.CL upper.CL
 inside  ant  0.0458 0.00398 73   0.0379   0.0538
 outside ant  0.1207 0.00839 72   0.1039   0.1374
 inside  post 0.0599 0.00457 72   0.0507   0.0690
 outside post 0.1390 0.00885 72   0.1214   0.1566

Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of amnesia, ax`
 1                          estimate      SE df t.ratio p.value
 inside ant - outside ant    -0.0748 0.00929 72  -8.052  <.0001
 inside ant - inside post    -0.0140 0.00312 72  -4.486  <.0001
 inside ant - outside post   -0.0931 0.00970 72  -9.600  <.0001
 outside ant - inside post    0.0608 0.00956 72   6.361  <.0001
 outside ant - outside post  -0.0183 0.00389 72  -4.715  <.0001
 inside post - outside post  -0.0791 0.00996 72  -7.947  <.0001

Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
P value adjustment: fdr method for 6 tests 
data_SC<-subset(data_LOO, supercluster=="2")
model<- lme((beta) ~ ax*amnesia, random=~amnesia|subj,  weights=varIdent(form=~1|ax), data=data_SC, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit)
anova(model)
emmeans(model, list(pairwise ~ amnesia*ax), adjust = "fdr")
$`emmeans of amnesia, ax`
 amnesia ax   emmean      SE df lower.CL upper.CL
 inside  ant  0.0335 0.00533 73   0.0229   0.0441
 outside ant  0.0751 0.00861 72   0.0580   0.0923
 inside  post 0.0590 0.00620 72   0.0467   0.0714
 outside post 0.0983 0.00947 72   0.0794   0.1172

Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of amnesia, ax`
 1                          estimate      SE df t.ratio p.value
 inside ant - outside ant    -0.0416 0.01010 72  -4.111  0.0002
 inside ant - inside post    -0.0255 0.00317 72  -8.046  <.0001
 inside ant - outside post   -0.0648 0.01090 72  -5.960  <.0001
 outside ant - inside post    0.0161 0.01060 72   1.521  0.1326
 outside ant - outside post  -0.0231 0.00395 72  -5.865  <.0001
 inside post - outside post  -0.0393 0.01130 72  -3.470  0.0011

Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
P value adjustment: fdr method for 6 tests 
data_SC<-subset(data_LOO, supercluster=="3")
model<- lme((beta) ~ ax*amnesia, random=~amnesia|subj,  weights=varIdent(form=~1|ax), data=data_SC, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit)
anova(model)
emmeans(model, list(pairwise ~ amnesia*ax), adjust = "fdr")
$`emmeans of amnesia, ax`
 amnesia ax   emmean      SE df lower.CL upper.CL
 inside  ant  0.0906 0.00596 73   0.0787    0.102
 outside ant  0.1069 0.00979 72   0.0874    0.126
 inside  post 0.0808 0.00661 72   0.0676    0.094
 outside post 0.1059 0.01040 72   0.0851    0.127

Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of amnesia, ax`
 1                          estimate      SE df t.ratio p.value
 inside ant - outside ant   -0.01635 0.01150 72  -1.427  0.2370
 inside ant - inside post    0.00979 0.00392 72   2.495  0.0893
 inside ant - outside post  -0.01534 0.01200 72  -1.278  0.2462
 outside ant - inside post   0.02614 0.01180 72   2.213  0.0902
 outside ant - outside post  0.00101 0.00489 72   0.207  0.8367
 inside post - outside post -0.02513 0.01230 72  -2.037  0.0906

Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
P value adjustment: fdr method for 6 tests 
data_SC<-subset(data_LOO, supercluster=="5")
model<- lme((beta) ~ ax*amnesia, random=~amnesia|subj, weights=varComb(varIdent(form=~1|ax), varPower(form=~fitted(.))), data=data_SC, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit)
anova(model)
emmeans(model, list(pairwise ~ ax), adjust = "fdr")
NOTE: Results may be misleading due to involvement in interactions
$`emmeans of ax`
 ax   emmean      SE df lower.CL upper.CL
 ant   0.123 0.00536 72    0.112    0.133
 post  0.136 0.00622 72    0.124    0.149

Results are averaged over the levels of: amnesia 
Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of ax`
 1          estimate      SE df t.ratio p.value
 ant - post  -0.0135 0.00411 72  -3.282  0.0016

Results are averaged over the levels of: amnesia 
Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
data_SC<-subset(data_LOO, supercluster=="6")
model<- lme((beta) ~ ax*amnesia, random=~amnesia|subj,  weights=varIdent(form=~1|ax), data=data_SC, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit)
anova(model)
emmeans(model, list(pairwise ~ amnesia*ax), adjust = "fdr")
$`emmeans of amnesia, ax`
 amnesia ax   emmean      SE df lower.CL upper.CL
 inside  ant   0.194 0.00889 73    0.176    0.211
 outside ant   0.185 0.00942 72    0.166    0.203
 inside  post  0.139 0.00820 72    0.122    0.155
 outside post  0.137 0.00839 72    0.120    0.153

Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of amnesia, ax`
 1                          estimate      SE df t.ratio p.value
 inside ant - outside ant    0.00892 0.01300 72   0.688  0.5921
 inside ant - inside post    0.05500 0.00672 72   8.179  <.0001
 inside ant - outside post   0.05705 0.01220 72   4.667  <.0001
 outside ant - inside post   0.04609 0.01250 72   3.691  0.0006
 outside ant - outside post  0.04813 0.00838 72   5.746  <.0001
 inside post - outside post  0.00205 0.01170 72   0.175  0.8619

Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
P value adjustment: fdr method for 6 tests 

Bar Plots

mPFC-STS supercluster


## define the cluster 
data_SC<-subset(data_LOO, supercluster=="3")

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("amnesia","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/windows_STS.tiff", units="in", width=5, height=4.5, res=1000)
ggplot(stats, aes(x=amnesia, y=beta, fill=ax)) + 
  theme_classic() +
  geom_bar(stat = "identity", position = "dodge", width = 0.8) + 
  geom_errorbar(width = .0, position = position_dodge(0.8), aes(ymin=lower_se, ymax=upper_se))+
  labs(x="", y="connectivity (Fisher z)") +
theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=18), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  labs(fill="") +
  scale_fill_manual(values=c('#f2f207','#fafab4'), labels = c("anterior", "posterior"))+ ### mPFC-STS
  scale_x_discrete(limits=c("inside", "outside"), labels=c("inside window", "outside window"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  geom_hline(yintercept=0)+
  ggtitle("vmPFC-STS
  supercluster")+
  theme(plot.title = element_text(size=22, face="bold", hjust=0.5), legend.position="bottom")

#dev.off()
#ggsave("vmpfc_sts.png", path="~/Downloads", width = 4.5, height = 4.5)

Cingulo-opercular supercluster


## define the cluster 
data_SC<-subset(data_LOO, supercluster=="1")

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("amnesia","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/windows_CO.tiff", units="in", width=5, height=4.5, res=1000)
ggplot(stats, aes(x=amnesia, y=beta, fill=ax)) + 
  theme_classic() +
  geom_bar(stat = "identity", position = "dodge", width = 0.8) + 
  geom_errorbar(width = .0, position = position_dodge(0.8), aes(ymin=lower_se, ymax=upper_se))+
  labs(x="", y="connectivity") +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=18), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  labs(fill="") +
  scale_fill_manual(values=c('#152370','#6577a1'), labels = c("anterior", "posterior"))+ 
  scale_x_discrete(limits=c("inside", "outside"), labels=c("inside window", "outside window"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  geom_hline(yintercept=0)+
  ggtitle("cingulo-opercular
  supercluster")+
  theme(plot.title = element_text(size=22, face="bold", hjust=0.5), legend.position="bottom")

#dev.off()
#ggsave("cingulo-operc.png", path="~/Downloads", width = 4.5, height = 4.5)

Dorsal frontal parietal supercluster


## define the cluster 
data_SC<-subset(data_LOO, supercluster=="2")

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("amnesia","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/windows_dFP.tiff", units="in", width=5, height=4.5, res=1000)
ggplot(stats, aes(x=amnesia, y=beta, fill=ax)) + 
  theme_classic() +
  geom_bar(stat = "identity", position = "dodge", width = 0.8) + 
  geom_errorbar(width = .0, position = position_dodge(0.8), aes(ymin=lower_se, ymax=upper_se))+
  labs(x="", y="connectivity (Fisher z)") +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=18), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  labs(fill="") +
  scale_fill_manual(values=c('#4bf52a','#a2f792'), labels = c("anterior", "posterior"))+ 
  scale_x_discrete(limits=c("inside", "outside"), labels=c("inside window", "outside window"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  geom_hline(yintercept=0)+
  ggtitle("dorsal frontal parietal
  supercluster")+
  theme(plot.title = element_text(size=22, face="bold", hjust=0.5), legend.position="bottom")

#dev.off()
#ggsave("dorsalFPN.png", path="~/Downloads", width = 4.5, height = 4.5)

Entorhinal supercluster


## define the cluster 
data_SC<-subset(data_LOO, supercluster=="6")

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("amnesia","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/windows_EC.tiff", units="in", width=5, height=4.5, res=1000)
ggplot(stats, aes(x=amnesia, y=beta, fill=ax)) + 
  theme_classic() +
  geom_bar(stat = "identity", position = "dodge", width = 0.8) + 
  geom_errorbar(width = .0, position = position_dodge(0.8), aes(ymin=lower_se, ymax=upper_se))+
  labs(x="", y="connectivity (Fisher z)") +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=18), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  labs(fill="") +
  scale_fill_manual(values=c('#28fcfc','#bfffff'), labels = c("anterior", "posterior"))+ 
  scale_x_discrete(limits=c("inside", "outside"), labels=c("inside window", "outside window"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  geom_hline(yintercept=0)+
  ggtitle("entorhinal
  supercluster")+
  theme(plot.title = element_text(size=22, face="bold", hjust=0.5), legend.position="bottom")

#dev.off()
#ggsave("entorhinal.png", path="~/Downloads", width = 4.5, height = 4.5)

Medial parietal supercluster


## define the cluster 
data_SC<-subset(data_LOO, supercluster=="5")

## summarize for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("amnesia","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot
#tiff("~/Downloads/windows_parietal.tiff", units="in", width=5, height=4.5, res=1000)
ggplot(stats, aes(x=amnesia, y=beta, fill=ax)) + 
  theme_classic() +
  geom_bar(stat = "identity", position = "dodge", width = 0.8) + 
  geom_errorbar(width = .0, position = position_dodge(0.8), aes(ymin=lower_se, ymax=upper_se))+
  labs(x="", y="connectivity") +
  theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=18), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  labs(fill="") +
  scale_fill_manual(values=c('#fa750f','#faa666'), labels = c("anterior", "posterior"))+
  scale_x_discrete(limits=c("inside", "outside"), labels=c("inside window", "outside window"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  geom_hline(yintercept=0)+
  ggtitle("medial parietal
  supercluster")+
  theme(plot.title = element_text(size=22, face="bold", hjust=0.5), legend.position="bottom")

#dev.off()
#ggsave("medialparietal.png", path="~/Downloads", width = 4.5, height = 4.5)

Parahippocampal supercluster

This cluster is not part of LOO analysis so running stats and plot separately


## read in the data, CHANGE TO YOUR PATH 
dir<-"/Users/audrainsp/Library/CloudStorage/OneDrive-NationalInstitutesofHealth/BabyHippos/R_BabyHippos"
data <- read.table(paste(dir, "/supercluster_antpost_betas_by_age.txt", sep=""), header = TRUE)

## get correct age range 
data<-subset(data, ((age>18 & age<26) | age>35))

## collapse over hem
data_ag_hem<-aggregate(data[, "beta"], by=(list(data$subj, data$roi, data$age, data$supercluster)), mean)
colnames(data_ag_hem)<-c("subj","ax","age","supercluster","beta")

## define supercluster
data_SC<-subset(data_ag_hem, supercluster=="4")

## create lable for inside and outside infantile amnesia window 
data_SC<-data_SC %>%
  mutate(amnesia=case_when(age<26 ~ "inside",
                      age>35 ~ "outside"))

## model 
model<- lme((beta) ~ ax*amnesia, random=~amnesia|subj,  weights=varComb(varIdent(form=~1|amnesia), varPower(form=~fitted(.))), data=data_SC, control = lmeControl(msMaxIter=1000, msMaxEval=1000), na.action=na.omit)

## diagnostics 
# hist(residuals(model))
# ##check for homogeneity of variance
# plot(model) #should look fairly uniform and random
# qqnorm(resid(model))
# qqline(resid(model))
# icc(model)

## stats 
anova(model)

## posthocs 
emmeans(model, list(pairwise ~ amnesia*ax), adjust = "fdr")
$`emmeans of amnesia, ax`
 amnesia ax         emmean      SE df lower.CL upper.CL
 inside  ant_hippo   0.143 0.00552 73    0.132    0.154
 outside ant_hippo   0.167 0.00944 72    0.148    0.186
 inside  post_hippo  0.175 0.00578 72    0.163    0.186
 outside post_hippo  0.199 0.00961 72    0.180    0.219

Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of amnesia, ax`
 1                                      estimate      SE df t.ratio p.value
 inside ant_hippo - outside ant_hippo   -0.02355 0.01090 72  -2.154  0.0415
 inside ant_hippo - inside post_hippo   -0.03130 0.00352 72  -8.883  <.0001
 inside ant_hippo - outside post_hippo  -0.05616 0.01110 72  -5.064  <.0001
 outside ant_hippo - inside post_hippo  -0.00775 0.01110 72  -0.700  0.4862
 outside ant_hippo - outside post_hippo -0.03260 0.00397 72  -8.215  <.0001
 inside post_hippo - outside post_hippo -0.02486 0.01120 72  -2.216  0.0415

Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
P value adjustment: fdr method for 6 tests 
emmeans(model, list(pairwise ~ amnesia), adjust = "fdr")
NOTE: Results may be misleading due to involvement in interactions
$`emmeans of amnesia`
 amnesia emmean      SE df lower.CL upper.CL
 inside   0.159 0.00537 72    0.148    0.170
 outside  0.183 0.00932 72    0.165    0.202

Results are averaged over the levels of: ax 
Degrees-of-freedom method: containment 
Results are given on the ( (not the response) scale. 
Confidence level used: 0.95 

$`pairwise differences of amnesia`
 1                estimate     SE df t.ratio p.value
 inside - outside  -0.0242 0.0108 72  -2.251  0.0275

Results are averaged over the levels of: ax 
Note: contrasts are still on the ( scale. Consider using
      regrid() if you want contrasts of back-transformed estimates. 
Degrees-of-freedom method: containment 
## format for plotting 
stats<-summarySE(data=data_SC, measurevar = "beta", groupvars = c("amnesia","ax"), na.rm=TRUE)
stats$upper_se<-stats$beta + stats$se
stats$lower_se<-stats$beta - stats$se

## plot 
#tiff("~/Downloads/windows_PH.tiff", units="in", width=5, height=4.5, res=1000)
ggplot(stats, aes(x=amnesia, y=beta, fill=ax)) + 
  theme_classic() +
  geom_bar(stat = "identity", position = "dodge", width = 0.8) + 
  geom_errorbar(width = .0, position = position_dodge(0.8), aes(ymin=lower_se, ymax=upper_se))+
  labs(x="", y="connectivity (Fisher z)") +
 theme(axis.title = element_text(size=24),  axis.ticks.x=element_blank(), text = element_text(size = 18), axis.text.x = element_text(size=18), axis.text.y = element_text(size=22), plot.title = element_text(face="bold", hjust=0.5, size=22), legend.position="none")+
  labs(fill="") +
  scale_fill_manual(values=c('#f5200c','#fc9288'), labels = c("anterior", "posterior"))+ 
  scale_x_discrete(limits=c("inside", "outside"), labels=c("inside window", "outside window"))+
  scale_y_continuous(expand = c(0, 0), limits = c(0,0.3), breaks=seq(0,0.3,.05))+
  geom_hline(yintercept=0)+
  ggtitle("parahippocampal
  supercluster")+
  theme(plot.title = element_text(size=22, face="bold", hjust=0.5), legend.position="bottom")

#dev.off()
#ggsave("parahippocampal.png", path="~/Downloads", width = 4.5, height = 4.5)
LS0tCnRpdGxlOiAiU3VwZXJjbHVzdGVyIFN0YXRpc3RpY3MiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClZlcnNpb24gMS4wLCBKdWx5IDIwMjUsIFNBCgpUaGlzIHNjcmlwdCBjYWxjdWxhdGVzIGEgd2VpZ2h0ZWQgYXZlcmFnZSBvZiBkYXRhIGNsdXN0ZXJlZCB0b2dldGhlciAxMDAlIGNvbnNpc3RlbnRseSBhY3Jvc3MgbGVhdmUxb3V0IGl0ZXJhdGlvbnMsIGFuZCBydW5zIHRoZSBzdGF0aXN0aWNhbCBjb21wYXJpc29ucyBmb3IgZWFjaCBzdXBlcmNsdXN0ZXIuIAoKSXQgcGxvdHMgdGhlIHN1cGVyY2x1c3RlciBjb25uZWN0aXZpdHkgcHJvZmlsZXMgaW4gRmlndXJlIDQuIAoKSXQgYWxzbyBydW5zIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNlcyBhbmQgcGxvdHMgZm9yIGluc2lkZSB2cyBvdXRzaWRlIGluZmFudGlsZSBhbW5lc2lhIHdpbmRvdyBjb21wYXJpc29ucyAoRmlndXJlIDUpCgpJbnB1dDogdGhyZXNoTWF0LmNzdiBhbmQgSGlwcG9fQmlueEF4aXNfRl9iZXRhcy50eHQKCgojIFBhY2thZ2VzIGFuZCBmdW5jdGlvbnMKYGBge3J9CgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KFJtaXNjKQoKCmBgYAoKIyBSZWFkIGluIGFuZCBwcmVwYXJlIHRoZSBkYXRhIApgYGB7cn0KCiMjIyBzcGVjaWZ5IGRpcmVjdG9yeSwgQ0hBTkdFIFRPIFlPVVIgUEFUSCAKZGlyPC0iL1VzZXJzL2F1ZHJhaW5zcC9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9PbmVEcml2ZS1OYXRpb25hbEluc3RpdHV0ZXNvZkhlYWx0aC9CYWJ5SGlwcG9zL1JfQmFieUhpcHBvcyIKCiMjIyMgcmVhZCBpbiBiaW5hcml6ZWQsIHRocmVzaG9sZGVkIG1hdHJpeC4gCiMjIyAxIGlzIHdoZXJlIGNsdXN0ZXJpbmcgd2FzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBzdWJqZWN0cywgMCB3YXMgaW5jb25zaXN0ZW50IApkYXRhX3RocmVzaE1hdCA8LSByZWFkLmNzdihwYXN0ZShkaXIsICIvdGhyZXNoTWF0LmNzdiIsIHNlcD0iIiksIGhlYWRlciA9IEZBTFNFKSAKIyMjIGdldCByaWQgb2YgZGlhZ29uYWwgYW5kIGxvd2VyIHRyaWFuZ2xlIG9mIHRoZSBiaW5hcml6ZWQgbWF0cml4IApkaWFnKGRhdGFfdGhyZXNoTWF0KTwtMApkYXRhX3RocmVzaE1hdFtsb3dlci50cmkoZGF0YV90aHJlc2hNYXQpXTwtMAoKIyMjIHJlYWQgaW4gb3VyIG9yaWdpbmFsIGRhdGEgYW5kIGZvcm1hdCBpdCBmb3Igb3VyIHB1cnBvc2VzIApkYXRhIDwtIHJlYWQudGFibGUocGFzdGUoZGlyLCAiL0hpcHBvX0JpbnhBeGlzX0ZfYmV0YXMudHh0Iiwgc2VwPSIiKSwgaGVhZGVyID0gVFJVRSkgCiMjIyBrZWVwIHRoZSB0b3AgNDQgY2x1c3RlcnMgZm9yIGNsdXN0ZXIgdGhyZXNob2xkIG9mIDEwCmRhdGE8LXN1YnNldChkYXRhLCBjbHVzdCA8IDQ1KQojIyBjb2xsYXBzZSBvdmVyIGhlbSBmb3IgZWFjaCBzdWJqIApkYXRhX2FnX2hlbTwtYWdncmVnYXRlKGRhdGFbLCAiYmV0YSJdLCBieT0obGlzdChkYXRhJHN1YmosIGRhdGEkYXgsIGRhdGEkYmluLCBkYXRhJGNsdXN0KSksIG1lYW4pCmNvbG5hbWVzKGRhdGFfYWdfaGVtKTwtYygic3ViaiIsImF4IiwiYmluIiwiY2x1c3QiLCJiZXRhIikKCmBgYAoKCiMgQW5hbHlzZXMgdXNpbmcgbGVhdmUtb25lLW91dCBjcm9zcyB2YWxpZGF0aW9uIAoKIyMgU2VsZWN0aXZlbHkgYXZlcmFnZSBhbnQgYW5kIHBvc3Qgc2VwYXJhdGVseSAKCmBgYHtyfQoKIyMjIyBzcGVjaWZ5IHdoaWNoIGNsdXN0ZXJzL3JvaXMgZ28gaW50byBlYWNoIHN1cGVyY2x1c3RlcgpzdXBlcmNsdXN0ZXJfMTwtYygxLDYsNywyOCwzNCwzNiw0MSw0MykKc3VwZXJjbHVzdGVyXzI8LWMoMiwzLDksMTEsMTMsMTQsMTYsMTksMjAsMjIsMjQsMzAsMzEsMzIsMzcsMzgsNDAsNDQpCnN1cGVyY2x1c3Rlcl8zPC1jKDQsMTUsMTcsMjMsMjUsMjYsMjksMzMsMzUsMzkpCnN1cGVyY2x1c3Rlcl80PC1jKDUsMTApCnN1cGVyY2x1c3Rlcl81PC1jKDgsMTIsMjcsNDIpCnN1cGVyY2x1c3Rlcl82PC1jKDE4LDIxKQoKIyMjIGFwcGVuZCBzdXBlcmNsdXN0ZXIgaW5mbyB0byBvdXIgZGF0YWZyYW1lCmRhdGFfYWdfaGVtPC1tdXRhdGUoZGF0YV9hZ19oZW0sIHN1cGVyY2x1c3RlciA9IGNhc2Vfd2hlbihjbHVzdCAlaW4lIHN1cGVyY2x1c3Rlcl8xIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ICVpbiUgc3VwZXJjbHVzdGVyXzIgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3QgJWluJSBzdXBlcmNsdXN0ZXJfMyB+IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdCAlaW4lIHN1cGVyY2x1c3Rlcl80IH4gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ICVpbiUgc3VwZXJjbHVzdGVyXzUgfiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3QgJWluJSBzdXBlcmNsdXN0ZXJfNiB+IDYpKQoKIyMjIGxvb3AgdGhyb3VnaCB0byBjcmVhdGUgYSBjb2x1bW4gb2YgYWdlcyBhbmQgYXBwZW5kIHRvIG91ciBkYXRhZnJhbWUKYWdlczwtYXMuZGF0YS5mcmFtZShjKCIwMG1vIiwgIjAxbW8iLCAiMDJtbyIsICIwM21vIiwgIjA0bW8iLCAiMDVtbyIsICIwNm1vIiwgIjA3bW8iLCAiMDhtbyIsICIwOW1vIiwgIjEwbW8iLCAiMTFtbyIsICIxMm1vIiwgIjEzbW8iLCAiMTRtbyIsICIxNW1vIiwgIjE2bW8iLCAiMTdtbyIsICIxOG1vIiwgIjE5bW8iLCAiMjBtbyIsICIyMW1vIiwgIjIybW8iLCAiMjNtbyIsICIyNG1vIiwgIjI1bW8iLCAiMjZtbyIpKQpjb2xuYW1lcyhhZ2VzKTwtYygiYWdlIikKCmZvciAociBpbiAxOm5yb3coZGF0YV9hZ19oZW0pKXsKICBmb3IgKGEgaW4gMTpucm93KGFnZXMpKQoKICBpZiAoKHN0cl9kZXRlY3QoZGF0YV9hZ19oZW1bciwic3ViaiJdLCBwYXR0ZXJuID0gYWdlc1thLF0pKSA9PVRSVUUpIHsKICAgIGRhdGFfYWdfaGVtW3IsImFnZSJdPC1hLTEKICB9IGVsc2UgaWYgKChzdHJfZGV0ZWN0KGRhdGFfYWdfaGVtW3IsInN1YmoiXSwgcGF0dGVybiA9ICIwMG1vIikpKSB7CiAgICBkYXRhX2FnX2hlbVtyLCJhZ2UiXTwtMAogIH0KfQoKIyMjIGluaXRpYWxpemUgc29tZSBlbXB0eSBsaXN0cyB0byBhcHBlbmQgdG8gbGF0ZXIsIGZvciBlYWNoIHN1cGVyY2x1c3RlcgpkYXRhX3NjXzE8LWRhdGEuZnJhbWUobWF0cml4KG5yb3c9MCwgbmNvbD02KSkKY29sbmFtZXMoZGF0YV9zY18xKTwtYygic3ViaiIsImJpbiIsImFnZSIsImF4Iiwic3VwZXJjbHVzdCIsImJldGEiKQoKZGF0YV9zY18yPC1kYXRhLmZyYW1lKG1hdHJpeChucm93PTAsIG5jb2w9NikpCmNvbG5hbWVzKGRhdGFfc2NfMik8LWMoInN1YmoiLCJiaW4iLCJhZ2UiLCJheCIsInN1cGVyY2x1c3QiLCJiZXRhIikKCmRhdGFfc2NfMzwtZGF0YS5mcmFtZShtYXRyaXgobnJvdz0wLCBuY29sPTYpKQpjb2xuYW1lcyhkYXRhX3NjXzMpPC1jKCJzdWJqIiwiYmluIiwiYWdlIiwiYXgiLCJzdXBlcmNsdXN0IiwiYmV0YSIpCgpkYXRhX3NjXzQ8LWRhdGEuZnJhbWUobWF0cml4KG5yb3c9MCwgbmNvbD02KSkKY29sbmFtZXMoZGF0YV9zY180KTwtYygic3ViaiIsImJpbiIsImFnZSIsImF4Iiwic3VwZXJjbHVzdCIsImJldGEiKQoKZGF0YV9zY181PC1kYXRhLmZyYW1lKG1hdHJpeChucm93PTAsIG5jb2w9NikpCmNvbG5hbWVzKGRhdGFfc2NfNSk8LWMoInN1YmoiLCJiaW4iLCJhZ2UiLCJheCIsInN1cGVyY2x1c3QiLCJiZXRhIikKCmRhdGFfc2NfNjwtZGF0YS5mcmFtZShtYXRyaXgobnJvdz0wLCBuY29sPTYpKQpjb2xuYW1lcyhkYXRhX3NjXzYpPC1jKCJzdWJqIiwiYmluIiwiYWdlIiwiYXgiLCJzdXBlcmNsdXN0IiwiYmV0YSIpCgojIyMgbG9vcCB0aHJvdWdoIG1hdHJpeCBhbmQgd2hlbiB0aGVyZSBpcyBhIDEsIGF2ZXJhZ2UgdGhlIHR3byByb2kgaGlwcG8tY29ydGljYWwgY29ubiB2YWx1ZXMgdG9nZXRoZXIKZm9yIChyIGluIDE6bnJvdyhkYXRhX3RocmVzaE1hdCkpIHsKCiAgZm9yIChjIGluIDE6bmNvbChkYXRhX3RocmVzaE1hdCkpIHsKCiAgICBpZiAoZGF0YV90aHJlc2hNYXRbcixjXT09MSl7CgogICAgICAjcHJpbnQoInllcyIpCgogICAgICB0ZW1wX3N1YnNldDwtc3Vic2V0KGRhdGFfYWdfaGVtLCAoY2x1c3Q9PXIgfCBjbHVzdD09YykpCgogICAgICAjIyMgYXZlcmFnZSBhY3Jvc3MgY2x1c3QKICAgICAgdGVtcF9hZ2c8LWFnZ3JlZ2F0ZSh0ZW1wX3N1YnNldFssICJiZXRhIl0sIGJ5PShsaXN0KHRlbXBfc3Vic2V0JHN1YmosdGVtcF9zdWJzZXQkYmluLCB0ZW1wX3N1YnNldCRhZ2UsIHRlbXBfc3Vic2V0JGF4LCB0ZW1wX3N1YnNldCRzdXBlcmNsdXN0ZXIpKSwgbWVhbikKICAgICAgY29sbmFtZXModGVtcF9hZ2cpPC1jKCJzdWJqIiwiYmluIiwiYWdlIiwiYXgiLCJzdXBlcmNsdXN0IiwiYmV0YSIpCgogICAgICBpZiAodGVtcF9hZ2dbMSwic3VwZXJjbHVzdCJdPT0iMSIpIHsKICAgICAgICBkYXRhX3NjXzE8LXJiaW5kKGRhdGFfc2NfMSwgdGVtcF9hZ2cpCiAgICAgIH0KCiAgICAgIGlmICh0ZW1wX2FnZ1sxLCJzdXBlcmNsdXN0Il09PSIyIikgewogICAgICAgIGRhdGFfc2NfMjwtcmJpbmQoZGF0YV9zY18yLCB0ZW1wX2FnZykKICAgICAgfQoKICAgICAgaWYgKHRlbXBfYWdnWzEsInN1cGVyY2x1c3QiXT09IjMiKSB7CiAgICAgICAgZGF0YV9zY18zPC1yYmluZChkYXRhX3NjXzMsIHRlbXBfYWdnKQogICAgICB9CgogICAgICBpZiAodGVtcF9hZ2dbMSwic3VwZXJjbHVzdCJdPT0iNCIpIHsKICAgICAgICBkYXRhX3NjXzQ8LXJiaW5kKGRhdGFfc2NfNCwgdGVtcF9hZ2cpCiAgICAgIH0KCiAgICAgIGlmICh0ZW1wX2FnZ1sxLCJzdXBlcmNsdXN0Il09PSI1IikgewogICAgICAgIGRhdGFfc2NfNTwtcmJpbmQoZGF0YV9zY181LCB0ZW1wX2FnZykKICAgICAgfQoKICAgICAgaWYgKHRlbXBfYWdnWzEsInN1cGVyY2x1c3QiXT09IjYiKSB7CiAgICAgICAgZGF0YV9zY182PC1yYmluZChkYXRhX3NjXzYsIHRlbXBfYWdnKQogICAgICB9CgogICAgfQoKICB9Cgp9CgojIyMgZGF0YSBmb3IgZWFjaCBzdXBlcmNsdXN0ZXIgd2VpZ2h0ZWQgYnkgY29uc2lzdGVuY3kgYWNyb3NzIGxlYXZlLW9uZS1vdXQgYW5hbHlzaXMKZGF0YV9zY18xPC1hZ2dyZWdhdGUoZGF0YV9zY18xWywgImJldGEiXSwgYnk9KGxpc3QoZGF0YV9zY18xJHN1YmosIGRhdGFfc2NfMSRiaW4sIGRhdGFfc2NfMSRhZ2UsIGRhdGFfc2NfMSRheCkpLCBtZWFuKQpjb2xuYW1lcyhkYXRhX3NjXzEpPC1jKCJzdWJqIiwiYmluIiwiYWdlIiwiYXgiLCJiZXRhIikKZGF0YV9zY18xJHN1cGVyY2x1c3RlcjwtMQoKZGF0YV9zY18yPC1hZ2dyZWdhdGUoZGF0YV9zY18yWywgImJldGEiXSwgYnk9KGxpc3QoZGF0YV9zY18yJHN1YmosIGRhdGFfc2NfMiRiaW4sIGRhdGFfc2NfMiRhZ2UsIGRhdGFfc2NfMiRheCkpLCBtZWFuKQpjb2xuYW1lcyhkYXRhX3NjXzIpPC1jKCJzdWJqIiwiYmluIiwiYWdlIiwiYXgiLCJiZXRhIikKZGF0YV9zY18yJHN1cGVyY2x1c3RlcjwtMgoKZGF0YV9zY18zPC1hZ2dyZWdhdGUoZGF0YV9zY18zWywgImJldGEiXSwgYnk9KGxpc3QoZGF0YV9zY18zJHN1YmosIGRhdGFfc2NfMyRiaW4sIGRhdGFfc2NfMyRhZ2UsIGRhdGFfc2NfMyRheCkpLCBtZWFuKQpjb2xuYW1lcyhkYXRhX3NjXzMpPC1jKCJzdWJqIiwiYmluIiwiYWdlIiwiYXgiLCJiZXRhIikKZGF0YV9zY18zJHN1cGVyY2x1c3RlcjwtMwoKIyMgbm90aGluZyBpbiB0aGlzIG9uZSwgcGFyYWhpcHBvY2FtcGFsLiBCZWNhdXNlIHRoZSBST0lzIHdlcmUgbm90IGNsdXN0ZXJlZCB0b2dldGhlciAxMDAlIG9mIHRoZSB0aW1lLgojIGRhdGFfc2NfNDwtYWdncmVnYXRlKGRhdGFfc2NfNFssICJiZXRhIl0sIGJ5PShsaXN0KGRhdGFfc2NfNCRzdWJqLCBkYXRhX3NjXzQkYmluKSksIG1lYW4pCiMgY29sbmFtZXMoZGF0YV9zY180KTwtYygic3ViaiIsImJpbiIsImJldGEiKQojIGRhdGFfc2NfNCRzdXBlcmNsdXN0ZXI8LTQKCmRhdGFfc2NfNTwtYWdncmVnYXRlKGRhdGFfc2NfNVssICJiZXRhIl0sIGJ5PShsaXN0KGRhdGFfc2NfNSRzdWJqLCBkYXRhX3NjXzUkYmluLCBkYXRhX3NjXzUkYWdlLCBkYXRhX3NjXzUkYXgpKSwgbWVhbikKY29sbmFtZXMoZGF0YV9zY181KTwtYygic3ViaiIsImJpbiIsImFnZSIsImF4IiwiYmV0YSIpCmRhdGFfc2NfNSRzdXBlcmNsdXN0ZXI8LTUKCmRhdGFfc2NfNjwtYWdncmVnYXRlKGRhdGFfc2NfNlssICJiZXRhIl0sIGJ5PShsaXN0KGRhdGFfc2NfNiRzdWJqLCBkYXRhX3NjXzYkYmluLCBkYXRhX3NjXzYkYWdlLCBkYXRhX3NjXzYkYXgpKSwgbWVhbikKY29sbmFtZXMoZGF0YV9zY182KTwtYygic3ViaiIsImJpbiIsImFnZSIsImF4IiwiYmV0YSIpCmRhdGFfc2NfNiRzdXBlcmNsdXN0ZXI8LTYKCgojZGF0YV9MT088LXJiaW5kKGRhdGFfc2NfMSxkYXRhX3NjXzIsZGF0YV9zY18zLGRhdGFfc2NfNSxkYXRhX3NjXzYpCmRhdGFfU0NfYWxsPC1yYmluZChkYXRhX3NjXzEsIGRhdGFfc2NfMiwgZGF0YV9zY18zLCBkYXRhX3NjXzUsIGRhdGFfc2NfNikKCmBgYAoKCiMjIE9tbmlidXMgdGVzdCBhY3Jvc3Mgc3VwZXJjbHVzdGVycyAKYGBge3J9CgojIyMgdHVybiB2YXJpYWJsZXMgaW50byBmYWN0b3JzIApkYXRhX1NDX2FsbCRiaW48LWFzLmZhY3RvcihkYXRhX1NDX2FsbCRiaW4pCmRhdGFfU0NfYWxsJHN1cGVyY2x1c3RlcjwtYXMuZmFjdG9yKGRhdGFfU0NfYWxsJHN1cGVyY2x1c3RlcikKCiMjIG1vZGVsIAojIyB0aGlzIG1vZGVsIHRha2VzIGZvcmV2ZXIgdG8gcnVuLCBzbyBjYW4gYWxzbyBqdXN0IHJlYWQgYSBzYXZlZCB2ZXJzaW9uIGluIHVzaW5nIHJlYWRSRFMKIyMgbW9kZWwgaXMgd2VpZ2h0ZWQgdG8gYWxsb3cgaGV0ZXJvc2tlZGFzdGljaXR5IAojbW9kZWw8LWxtZShiZXRhIH4gYXgqYmluKnN1cGVyY2x1c3RlciwgcmFuZG9tPSB+MXxzdWJqLCB3ZWlnaHRzPXZhcklkZW50KGZvcm09fjF8YmluKmF4KnN1cGVyY2x1c3RlciksIGRhdGE9ZGF0YV9TQ19hbGwsIGNvbnRyb2wgPSBsbWVDb250cm9sKG1zTWF4SXRlcj0xMDAwLCBtc01heEV2YWw9MTAwMCksIG5hLmFjdGlvbj1uYS5vbWl0KSAKbW9kZWw8LXJlYWRSRFMoJy9Vc2Vycy9hdWRyYWluc3AvTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtTmF0aW9uYWxJbnN0aXR1dGVzb2ZIZWFsdGgvQmFieUhpcHBvcy9SX0JhYnlIaXBwb3MvR2l0SHViL21vZDFfd2VpZ2h0ZWRfYXhfYmluX3N1cGVyY2x1c3Rlci5yZGEnKSAjIyMgQ0hBTkdFIFRPIFlPVVIgUEFUSC4gT1IgUlVOIEFCT1ZFIE1PREVMLiAKCiMjIG1vZGVsIGRpYWdub3N0aWNzIApoaXN0KHJlc2lkdWFscyhtb2RlbCkpCnBsb3QobW9kZWwpCgojIyBzdGF0cyAKYW5vdmEobW9kZWwpIAoKIyMjIyBwb3N0IGhvY3MKIyMgdGhlc2UgYXJlIHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyB1c2VkIGluIHRoZSBtYW51c2NyaXB0IAojIyBzdGF0cyBmb3IgMiB3YXkgaW50ZXJhY3Rpb25zIGZvciBlYWNoIHN1cGVyY2x1c3RlciBjYW4gYmUgZm91bmQgbmV4dCB0byBlYWNoIHN1YnBsb3QgYmVsb3cgCmVtbWVhbnMobW9kZWwsIGxpc3QocGFpcndpc2UgfiBheHxiaW58c3VwZXJjbHVzdGVyKSwgYWRqdXN0ID0gIm5vbmUiKQplbW1lYW5zKG1vZGVsLCBsaXN0KHBhaXJ3aXNlIH4gYmlufGF4fHN1cGVyY2x1c3RlciksIGFkanVzdCA9ICJub25lIikKCiMjIyBzYXZlIHRoZSBvdXRwdXQsIGlmIGRlc2lyZWQgCiMgY2FwdHVyZS5vdXRwdXQoZW1tZWFucyhtb2RlbCwgbGlzdChwYWlyd2lzZSB+IGJpbnxheHxzdXBlcmNsdXN0ZXIpLCBhZGp1c3QgPSAiZmRyIiksIGZpbGU9Ii9Vc2Vycy9zYW1hbnRoYWF1ZHJhaW4vRG9jdW1lbnRzL1NjaWVuY2VfUHJvamVjdHMvQmFieUhpcHBvcy9SX0JhYnlIaXBwb3MvbW9kMl93ZWlnaHRlZF9heF9iaW5fc3VwZXJjbHVzdGVyX2VtbWVhbnMxX2Zkci5kb2MiKQojIAojIGNhcHR1cmUub3V0cHV0KGVtbWVhbnMobW9kZWwsIGxpc3QocGFpcndpc2UgfiBheHxiaW58c3VwZXJjbHVzdGVyKSwgYWRqdXN0ID0gImZkciIpLCBmaWxlPSIvVXNlcnMvc2FtYW50aGFhdWRyYWluL0RvY3VtZW50cy9TY2llbmNlX1Byb2plY3RzL0JhYnlIaXBwb3MvUl9CYWJ5SGlwcG9zL21vZDJfd2VpZ2h0ZWRfYXhfYmluX3N1cGVyY2x1c3Rlcl9lbW1lYW5zMl9mZHIuZG9jIikKCgpgYGAKCgojIyBNb2RlbHMgYW5kIFBsb3RzCgojIyMgQ2luZ3Vsby1vcGVyY3VsYXIgc3VwZXJjbHVzdGVyCmBgYHtyLCBmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTQuNX0KCiMjIHByZXBhcmUgdGhlIGRhdGEgCmRhdGFfU0M8LWRhdGFfc2NfMSAjIyMgdGhpcyBpcyB3ZWlnaHRlZCBhdmVyYWdlZCBkYXRhIGFjcm9zcyBjb21wb25lbnQgY2x1c3RlcnMgCmRhdGFfU0MkYmluPC1hcy5mYWN0b3IoZGF0YV9TQyRiaW4pCgojIyBydW4gdGhlIG1vZGVsIAptb2RlbDwtbG1lKGJldGEgfiBheCpiaW4sIHJhbmRvbT0gfjF8c3Viaiwgd2VpZ2h0cz12YXJJZGVudChmb3JtPX4xfGJpbiksIGRhdGE9ZGF0YV9TQywgbmEuYWN0aW9uPW5hLm9taXQpCgojIyBtb2RlbCBkaWFnbm9zdGljcyAKIyBoaXN0KHJlc2lkdWFscyhtb2RlbCkpCiMgcGxvdChtb2RlbCkKCiMgc3RhdHMKYW5vdmEobW9kZWwpIAoKIyMgc3VtbWFyaXplIGZvciBwbG90dGluZyAKc3RhdHM8LXN1bW1hcnlTRShkYXRhPWRhdGFfU0MsIG1lYXN1cmV2YXIgPSAiYmV0YSIsIGdyb3VwdmFycyA9IGMoImJpbiIsImF4IiksIG5hLnJtPVRSVUUpCnN0YXRzJHVwcGVyX3NlPC1zdGF0cyRiZXRhICsgc3RhdHMkc2UKc3RhdHMkbG93ZXJfc2U8LXN0YXRzJGJldGEgLSBzdGF0cyRzZQoKIyMgcGxvdAojdGlmZigifi9Eb3dubG9hZHMvY2luZ19vcGVyYy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YmluLCB5PWJldGEsIGdyb3VwPWF4KSkgKyAKICBnZW9tX2xpbmUoc2l6ZT0xLCBhZXMobGluZXR5cGU9InNvbGlkIiwgY29sb3I9YXgpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IC4wLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiMSIsICIyIiwgIjMiLCAiNCIpLCBsYWJlbHM9YygiMC02IiwgIjctMTIiLCAiMTMtMTgiLCIxOS0yNSIpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCcjMTUyMzcwJywnIzY1NzdhMScpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTApKwogICMgZ2d0aXRsZSgiY2luZ3Vsby1vcGVyY3VsYXIKICAjIHN1cGVyY2x1c3RlciIpKwogIGxhYnMoeD0iYWdlIiwgeT0iY29ubmVjdGl2aXR5IiwgY29sb3I9ImhpcHBvY2FtcGFsIGF4aXMiKQojZGV2Lm9mZigpCgojZ2dzYXZlKCJjaW5ndWxvLW9wZXJjLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgpgYGAKCiMjIyBEb3JzYWwgZnJvbnRhbCBwYXJpZXRhbCBzdXBlcmNsdXN0ZXIKYGBge3IsIGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9NC41fQoKIyMgcHJlcGFyZSB0aGUgZGF0YSAKZGF0YV9TQzwtZGF0YV9zY18yICMjIyB0aGlzIGlzIHdlaWdodGVkIGF2ZXJhZ2VkIGRhdGEgYWNyb3NzIGNvbXBvbmVudCBjbHVzdGVycyAKZGF0YV9TQyRiaW48LWFzLmZhY3RvcihkYXRhX1NDJGJpbikKCiMjIHJ1biB0aGUgbW9kZWwgCm1vZGVsPC1sbWUoYmV0YSB+IGF4KmJpbiwgcmFuZG9tPSB+MXxzdWJqLCBkYXRhPWRhdGFfU0MsIG5hLmFjdGlvbj1uYS5vbWl0KQoKIyMgbW9kZWwgZGlhZ25vc3RpY3MgCiMgaGlzdChyZXNpZHVhbHMobW9kZWwpKQojIHBsb3QobW9kZWwpCgojIyBzdGF0cyAKYW5vdmEobW9kZWwpIAoKIyMgc3VtbWFyaXplIGZvciBwbG90dGluZyAKc3RhdHM8LXN1bW1hcnlTRShkYXRhPWRhdGFfU0MsIG1lYXN1cmV2YXIgPSAiYmV0YSIsIGdyb3VwdmFycyA9IGMoImJpbiIsImF4IiksIG5hLnJtPVRSVUUpCnN0YXRzJHVwcGVyX3NlPC1zdGF0cyRiZXRhICsgc3RhdHMkc2UKc3RhdHMkbG93ZXJfc2U8LXN0YXRzJGJldGEgLSBzdGF0cyRzZQoKIyMgcGxvdAojdGlmZigifi9Eb3dubG9hZHMvZEZQTi50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YmluLCB5PWJldGEsIGdyb3VwPWF4KSkgKyAKICBnZW9tX2xpbmUoc2l6ZT0xLCBhZXMobGluZXR5cGU9InNvbGlkIiwgY29sb3I9YXgpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IC4wLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogICAgIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiMSIsICIyIiwgIjMiLCAiNCIpLCBsYWJlbHM9YygiMC02IiwgIjctMTIiLCAiMTMtMTgiLCIxOS0yNSIpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCcjNGJmNTJhJywnI2JkZjdiMicpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTApKwogICMgZ2d0aXRsZSgiZG9yc2FsIGZyb250YWwgcGFyaWV0YWwKICAjIHN1cGVyY2x1c3RlciIpKwogIGxhYnMoeD0iYWdlIiwgeT0iY29ubmVjdGl2aXR5IiwgY29sb3I9ImhpcHBvY2FtcGFsIGF4aXMiKQojZGV2Lm9mZigpCgojZ2dzYXZlKCJkb3JzYWxGUE4ucG5nIiwgcGF0aD0ifi9Eb3dubG9hZHMiLCB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gNCkKCmBgYAoKIyMjIG1QRkMtU1RTIHN1cGVyY2x1c3RlciAKYGBge3IsIGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9NC41fQoKIyMgcHJlcGFyZSB0aGUgZGF0YSAKZGF0YV9TQzwtZGF0YV9zY18zICMjIyB0aGlzIGlzIHdlaWdodGVkIGF2ZXJhZ2VkIGRhdGEgYWNyb3NzIGNvbXBvbmVudCBjbHVzdGVycyAKZGF0YV9TQyRiaW48LWFzLmZhY3RvcihkYXRhX1NDJGJpbikKCiMjIHJ1biB0aGUgbW9kZWwgCm1vZGVsPC1sbWUoYmV0YSB+IGF4KmJpbiwgcmFuZG9tPSB+MXxzdWJqLCBkYXRhPWRhdGFfU0MsIG5hLmFjdGlvbj1uYS5vbWl0KQoKIyMgbW9kZWwgZGlhZ25vc3RpY3MgCiMgaGlzdChyZXNpZHVhbHMobW9kZWwpKQojIHBsb3QobW9kZWwpCgojIyBzdGF0cyAKYW5vdmEobW9kZWwpIAoKIyMgc3VtbWFyaXplIGZvciBwbG90dGluZyAKc3RhdHM8LXN1bW1hcnlTRShkYXRhPWRhdGFfU0MsIG1lYXN1cmV2YXIgPSAiYmV0YSIsIGdyb3VwdmFycyA9IGMoImJpbiIsImF4IiksIG5hLnJtPVRSVUUpCnN0YXRzJHVwcGVyX3NlPC1zdGF0cyRiZXRhICsgc3RhdHMkc2UKc3RhdHMkbG93ZXJfc2U8LXN0YXRzJGJldGEgLSBzdGF0cyRzZQoKIyMgcGxvdAojdGlmZigifi9Eb3dubG9hZHMvbVBGQ1NUUy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YmluLCB5PWJldGEsIGdyb3VwPWF4KSkgKyAKICBnZW9tX2xpbmUoc2l6ZT0xLCBhZXMobGluZXR5cGU9InNvbGlkIiwgY29sb3I9YXgpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IC4wLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoIjEiLCAiMiIsICIzIiwgIjQiKSwgbGFiZWxzPWMoIjAtNiIsICI3LTEyIiwgIjEzLTE4IiwiMTktMjUiKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygnI2YyZjIwNycsJyNmYWZhYjQnKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wKSsKICAjIGdndGl0bGUoInZtUEZDLVNUUwogICMgc3VwZXJjbHVzdGVyIikrCiAgbGFicyh4PSJhZ2UiLCB5PSJjb25uZWN0aXZpdHkiLCBjb2xvcj0iaGlwcG9jYW1wYWwgYXhpcyIpCiNkZXYub2ZmKCkKCiNnZ3NhdmUoInZtcGZjX3N0cy5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKYGBgCgojIyMgTWVkaWFsIHBhcmlldGFsIHN1cGVyY2x1c3RlcgpgYGB7ciwgZmlnLmhlaWdodD00LGZpZy53aWR0aD00LjV9CgojIyBwcmVwYXJlIHRoZSBkYXRhIApkYXRhX1NDPC1kYXRhX3NjXzUgIyMjIHRoaXMgaXMgd2VpZ2h0ZWQgYXZlcmFnZWQgZGF0YSBhY3Jvc3MgY29tcG9uZW50IGNsdXN0ZXJzIApkYXRhX1NDJGJpbjwtYXMuZmFjdG9yKGRhdGFfU0MkYmluKQoKIyMgcnVuIHRoZSBtb2RlbCAKbW9kZWw8LWxtZShiZXRhIH4gYXgqYmluLCByYW5kb209IH4xfHN1YmosIGRhdGE9ZGF0YV9TQywgbmEuYWN0aW9uPW5hLm9taXQpCgojIyBtb2RlbCBkaWFnbm9zdGljcyAKIyBoaXN0KHJlc2lkdWFscyhtb2RlbCkpCiMgcGxvdChtb2RlbCkKCiMjIHN0YXRzIAphbm92YShtb2RlbCkgCgojIyBzdW1tYXJpemUgZm9yIHBsb3R0aW5nIApzdGF0czwtc3VtbWFyeVNFKGRhdGE9ZGF0YV9TQywgbWVhc3VyZXZhciA9ICJiZXRhIiwgZ3JvdXB2YXJzID0gYygiYmluIiwiYXgiKSwgbmEucm09VFJVRSkKc3RhdHMkdXBwZXJfc2U8LXN0YXRzJGJldGEgKyBzdGF0cyRzZQpzdGF0cyRsb3dlcl9zZTwtc3RhdHMkYmV0YSAtIHN0YXRzJHNlCgojIyBwbG90CiN0aWZmKCJ+L0Rvd25sb2Fkcy9wYXJpZXRhbC50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YmluLCB5PWJldGEsIGdyb3VwPWF4KSkgKyAKICBnZW9tX2xpbmUoc2l6ZT0xLCBhZXMobGluZXR5cGU9InNvbGlkIiwgY29sb3I9YXgpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IC4wLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoIjEiLCAiMiIsICIzIiwgIjQiKSwgbGFiZWxzPWMoIjAtNiIsICI3LTEyIiwgIjEzLTE4IiwiMTktMjUiKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygnI2ZhNzUwZicsJyNmYWE2NjYnKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wKSsKICAjIGdndGl0bGUoIm1lZGlhbCBwYXJpZXRhbAogICMgc3VwZXJjbHVzdGVyIikrCiAgbGFicyh4PSJhZ2UiLCB5PSJjb25uZWN0aXZpdHkiLCBjb2xvcj0iaGlwcG9jYW1wYWwgYXhpcyIpCiNkZXYub2ZmKCkKCiNnZ3NhdmUoIm1lZGlhbHBhcmlldGFsLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgpgYGAKCiMjIyBFbnRvcmhpbmFsIHN1cGVyY2x1c3RlcgpgYGB7ciwgZmlnLmhlaWdodD00LGZpZy53aWR0aD00LjV9CgojIyBwcmVwYXJlIHRoZSBkYXRhIApkYXRhX1NDPC1kYXRhX3NjXzYgIyMjIHRoaXMgaXMgd2VpZ2h0ZWQgYXZlcmFnZWQgZGF0YSBhY3Jvc3MgY29tcG9uZW50IGNsdXN0ZXJzIApkYXRhX1NDJGJpbjwtYXMuZmFjdG9yKGRhdGFfU0MkYmluKQoKIyMgcnVuIHRoZSBtb2RlbCAKbW9kZWw8LWxtZShiZXRhIH4gYXgqYmluLCByYW5kb209IH4xfHN1YmosIGRhdGE9ZGF0YV9TQywgbmEuYWN0aW9uPW5hLm9taXQpCgojIyBtb2RlbCBkaWFnbm9zdGljcyAKIyBoaXN0KHJlc2lkdWFscyhtb2RlbCkpCiMgcGxvdChtb2RlbCkKCiMjIHN0YXRzIAphbm92YShtb2RlbCkgCgojIyBzdW1tYXJpemUgZm9yIHBsb3R0aW5nIApzdGF0czwtc3VtbWFyeVNFKGRhdGE9ZGF0YV9TQywgbWVhc3VyZXZhciA9ICJiZXRhIiwgZ3JvdXB2YXJzID0gYygiYmluIiwiYXgiKSwgbmEucm09VFJVRSkKc3RhdHMkdXBwZXJfc2U8LXN0YXRzJGJldGEgKyBzdGF0cyRzZQpzdGF0cyRsb3dlcl9zZTwtc3RhdHMkYmV0YSAtIHN0YXRzJHNlCgojIyBwbG90CiN0aWZmKCJ+L0Rvd25sb2Fkcy9FQy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YmluLCB5PWJldGEsIGdyb3VwPWF4KSkgKyAKICBnZW9tX2xpbmUoc2l6ZT0xLCBhZXMobGluZXR5cGU9InNvbGlkIiwgY29sb3I9YXgpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IC4wLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoIjEiLCAiMiIsICIzIiwgIjQiKSwgbGFiZWxzPWMoIjAtNiIsICI3LTEyIiwgIjEzLTE4IiwiMTktMjUiKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygnIzI4ZmNmYycsJyNiZmZmZmYnKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wKSsKICAjIGdndGl0bGUoImVudG9yaGluYWwKICAjIHN1cGVyY2x1c3RlciIpKwogIGxhYnMoeD0iYWdlIiwgeT0iY29ubmVjdGl2aXR5IiwgY29sb3I9ImhpcHBvY2FtcGFsIGF4aXMiKQojZGV2Lm9mZigpCgojZ2dzYXZlKCJlbnRvcmhpbmFsLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgpgYGAKCgojIyBMT0VTUyBwbG90cyB0byB2aXN1YWxpemUgY29udGludW91cyBkYXRhIAoKUGxvdHRpbmcgYW50ZXJpb3IgYW5kIHBvc3RlcmlvciBkYXRhIHNlcGFyYXRlbHkgYW5kIG92ZXJsYWlkIGZvciBiZXN0IHZpc3VhbGl6YXRpb24gCgojIyMgQ2luZ3Vsby1vcGVyY3VsYXIgc3VwZXJjbHVzdGVyCmBgYHtyLCBmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTQuNX0KClNDX2RhdGE8LXN1YnNldChkYXRhX3NjXzEsIHN1cGVyY2x1c3Rlcj09MSAmIGF4PT0iYW50IikKCiN0aWZmKCJ+L0Rvd25sb2Fkcy9DUF8xLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD00LjUsIGhlaWdodD00LCByZXM9MTAwMCkKZ2dwbG90KFNDX2RhdGEsIGFlcyh5PWJldGEsIHg9YWdlKSkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTgsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI1LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3BvaW50KHNpemU9MiwgYWxwaGE9MC43KSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBsZXZlbD0wLjk1LCBjb2w9IiMxNTIzNzAiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI0KSwgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0yMCksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdD0wLjUsIHNpemU9MjIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMjApKSsKICBndWlkZXMoc2hhcGUgPSBGQUxTRSwgc2l6ZSA9IEZBTFNFKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwyNiksIGJyZWFrcz1zZXEoMCwyNiw1KSkrCiAgbGFicyh5ID0gImNvbm5lY3Rpdml0eSAoRmlzaGVyIHopIiwKICAgICAgIHggPSAiYWdlIChtb250aHMpIiwKICAgICAgIHRpdGxlID0gIiIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgiY2luZ3Vsby1vcGVyY19hbnQucG5nIiwgcGF0aD0ifi9Eb3dubG9hZHMiLCB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gNCkKCgpTQ19kYXRhPC1zdWJzZXQoZGF0YV9zY18xLCBzdXBlcmNsdXN0ZXI9PTEgJiBheD09InBvc3QiKQoKI3RpZmYoIn4vRG93bmxvYWRzL0NQXzIudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQuNSwgaGVpZ2h0PTQsIHJlcz0xMDAwKQpnZ3Bsb3QoU0NfZGF0YSwgYWVzKHk9YmV0YSwgeD1hZ2UpKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDYsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEyLCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOCwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjUsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fcG9pbnQoc2l6ZT0yLCBhbHBoYT0wLjcpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iIzY1NzdhMSIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygyMCkpKwogIGd1aWRlcyhzaGFwZSA9IEZBTFNFLCBzaXplID0gRkFMU0UpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMC4zKSwgYnJlYWtzPXNlcSgwLDAuMywuMDUpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDI2KSwgYnJlYWtzPXNlcSgwLDI2LDUpKSsKICBsYWJzKHkgPSAiY29ubmVjdGl2aXR5IChGaXNoZXIgeikiLAogICAgICAgeCA9ICJhZ2UgKG1vbnRocykiLAogICAgICAgdGl0bGUgPSAiIikKI2Rldi5vZmYoKQojZ2dzYXZlKCJjaW5ndWxvLW9wZXJjX3Bvc3QucG5nIiwgcGF0aD0ifi9Eb3dubG9hZHMiLCB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gNCkKCgoKIyMjIGJvdGggcGxvdHMgb3ZlcmxhaWQgClNDX2RhdGE8LXN1YnNldChkYXRhX3NjXzEsIHN1cGVyY2x1c3Rlcj09MSkKCiN0aWZmKCJ+L0Rvd25sb2Fkcy9DUF8zLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD00LjUsIGhlaWdodD00LCByZXM9MTAwMCkKZ2dwbG90KFNDX2RhdGEsIGFlcyh5PWJldGEsIHg9YWdlLCBncm91cD1heCwgY29sb3I9YXgpKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDYsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEyLCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOCwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjUsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBsZXZlbD0wLjk1KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzE1MjM3MCIsIiM2NTc3YTEiKSkrCiAgdGhlbWVfY2xhc3NpYygpICsKIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoImNpbmd1bG8tb3BlcmNfYW50cG9zdC5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKCmBgYAoKIyMjIERvcnNhbCBmcm9udGFsIHBhcmlldGFsIHN1cGVyY2x1c3RlcgpgYGB7ciwgZmlnLmhlaWdodD00LGZpZy53aWR0aD00LjV9ClNDX2RhdGE8LXN1YnNldChkYXRhX3NjXzIsIHN1cGVyY2x1c3Rlcj09MiAmIGF4PT0iYW50IikKCiN0aWZmKCJ+L0Rvd25sb2Fkcy9GUE5fMS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChTQ19kYXRhLCBhZXMoeT1iZXRhLCB4PWFnZSkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iIzRiZjUyYSIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoIkRGUF9hbnRfeW91bmdlci5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKCgpTQ19kYXRhPC1zdWJzZXQoZGF0YV9zY18yLCBzdXBlcmNsdXN0ZXI9PTIgJiBheD09InBvc3QiKQoKI3RpZmYoIn4vRG93bmxvYWRzL0ZQTl8yLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD00LjUsIGhlaWdodD00LCByZXM9MTAwMCkKZ2dwbG90KFNDX2RhdGEsIGFlcyh5PWJldGEsIHg9YWdlKSkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTgsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI1LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3BvaW50KHNpemU9MiwgYWxwaGE9MC43KSArICAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgbGV2ZWw9MC45NSwgY29sPSIjYTJmNzkyIikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoIkRGUF9wb3N0X3lvdW5nZXIucG5nIiwgcGF0aD0ifi9Eb3dubG9hZHMiLCB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gNCkKCgpTQ19kYXRhPC1zdWJzZXQoZGF0YV9zY18yLCBzdXBlcmNsdXN0ZXI9PTIpCgojdGlmZigifi9Eb3dubG9hZHMvRlBOXzMudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQuNSwgaGVpZ2h0PTQsIHJlcz0xMDAwKQpnZ3Bsb3QoU0NfZGF0YSwgYWVzKHk9YmV0YSwgeD1hZ2UsIGdyb3VwPWF4LCBjb2xvcj1heCkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjNGJmNTJhIiwiI2JkZjdiMiIpKSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoIkRGUF9hbnRwb3N0LnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgoKYGBgCgojIyMgbVBGQy1TVFMgc3VwZXJjbHVzdGVyCmBgYHtyLCBmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTQuNX0KClNDX2RhdGE8LXN1YnNldChkYXRhX3NjXzMsIHN1cGVyY2x1c3Rlcj09MyAmIGF4PT0iYW50IikKCiN0aWZmKCJ+L0Rvd25sb2Fkcy9TVFNfMS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChTQ19kYXRhLCBhZXMoeT1iZXRhLCB4PWFnZSkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iI2YyZjIwNyIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygyMCkpKwogIGd1aWRlcyhzaGFwZSA9IEZBTFNFLCBzaXplID0gRkFMU0UpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMC4zKSwgYnJlYWtzPXNlcSgwLDAuMywuMDUpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDI2KSwgYnJlYWtzPXNlcSgwLDI2LDUpKSsKICBsYWJzKHkgPSAiY29ubmVjdGl2aXR5IChGaXNoZXIgeikiLAogICAgICAgeCA9ICJhZ2UgKG1vbnRocykiLAogICAgICAgdGl0bGUgPSAiIikKI2Rldi5vZmYoKQojZ2dzYXZlKCJtUEZDX2FudF95b3VuZ2VyLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgoKU0NfZGF0YTwtc3Vic2V0KGRhdGFfc2NfMywgc3VwZXJjbHVzdGVyPT0zICYgYXg9PSJwb3N0IikKCiN0aWZmKCJ+L0Rvd25sb2Fkcy9TVFNfMi50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChTQ19kYXRhLCBhZXMoeT1iZXRhLCB4PWFnZSkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iI2ZhZmFiNCIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygyMCkpKwogIGd1aWRlcyhzaGFwZSA9IEZBTFNFLCBzaXplID0gRkFMU0UpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMC4zKSwgYnJlYWtzPXNlcSgwLDAuMywuMDUpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDI2KSwgYnJlYWtzPXNlcSgwLDI2LDUpKSsKICBsYWJzKHkgPSAiY29ubmVjdGl2aXR5IChGaXNoZXIgeikiLAogICAgICAgeCA9ICJhZ2UgKG1vbnRocykiLAogICAgICAgdGl0bGUgPSAiIikKI2Rldi5vZmYoKQojZ2dzYXZlKCJtUEZDX3Bvc3RfeW91bmdlci5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKCgpTQ19kYXRhPC1zdWJzZXQoZGF0YV9zY18zLCBzdXBlcmNsdXN0ZXI9PTMpCgojdGlmZigifi9Eb3dubG9hZHMvU1RTXzMudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQuNSwgaGVpZ2h0PTQsIHJlcz0xMDAwKQpnZ3Bsb3QoU0NfZGF0YSwgYWVzKHk9YmV0YSwgeD1hZ2UsIGdyb3VwPWF4LCBjb2xvcj1heCkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjZjJmMjA3IiwiI2ZhZmFiNCIpKSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoIm1QRkNfYW50cG9zdC5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKCmBgYAoKIyMjIE1lZGlhbCBwYXJpZXRhbCBzdXBlcmNsdXN0ZXIKYGBge3IsIGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9NC41fQoKU0NfZGF0YTwtc3Vic2V0KGRhdGFfc2NfNSwgc3VwZXJjbHVzdGVyPT01ICYgYXg9PSJhbnQiKQoKI3RpZmYoIn4vRG93bmxvYWRzL3BhcmlldGFsXzEudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQuNSwgaGVpZ2h0PTQsIHJlcz0xMDAwKQpnZ3Bsb3QoU0NfZGF0YSwgYWVzKHk9YmV0YSwgeD1hZ2UpKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDYsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEyLCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOCwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjUsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fcG9pbnQoc2l6ZT0yLCBhbHBoYT0wLjcpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iI2ZhNzUwZiIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygyMCkpKwogIGd1aWRlcyhzaGFwZSA9IEZBTFNFLCBzaXplID0gRkFMU0UpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMC4zKSwgYnJlYWtzPXNlcSgwLDAuMywuMDUpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDI2KSwgYnJlYWtzPXNlcSgwLDI2LDUpKSsKICBsYWJzKHkgPSAiY29ubmVjdGl2aXR5IChGaXNoZXIgeikiLAogICAgICAgeCA9ICJhZ2UgKG1vbnRocykiLAogICAgICAgdGl0bGUgPSAiIikKI2Rldi5vZmYoKQojZ2dzYXZlKCJwYXJpZXRhbF9hbnRfeW91bmdlci5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKClNDX2RhdGE8LXN1YnNldChkYXRhX3NjXzUsIHN1cGVyY2x1c3Rlcj09NSAmIGF4PT0icG9zdCIpCgojdGlmZigifi9Eb3dubG9hZHMvcGFyaWV0YWxfMi50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChTQ19kYXRhLCBhZXMoeT1iZXRhLCB4PWFnZSkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgbGV2ZWw9MC45NSwgY29sPSIjZmFhNjY2IikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoInBhcmlldGFsX3Bvc3RfeW91bmdlci5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKCgpTQ19kYXRhPC1zdWJzZXQoZGF0YV9zY181LCBzdXBlcmNsdXN0ZXI9PTUpCgojdGlmZigifi9Eb3dubG9hZHMvcGFyaWV0YWxfMy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChTQ19kYXRhLCBhZXMoeT1iZXRhLCB4PWFnZSwgZ3JvdXA9YXgsIGNvbG9yPWF4KSkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTgsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI1LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgbGV2ZWw9MC45NSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNmYTc1MGYiLCIjZmFhNjY2IikpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI0KSwgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0yMCksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdD0wLjUsIHNpemU9MjIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMjApKSsKICBndWlkZXMoc2hhcGUgPSBGQUxTRSwgc2l6ZSA9IEZBTFNFKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwyNiksIGJyZWFrcz1zZXEoMCwyNiw1KSkrCiAgbGFicyh5ID0gImNvbm5lY3Rpdml0eSAoRmlzaGVyIHopIiwKICAgICAgIHggPSAiYWdlIChtb250aHMpIiwKICAgICAgIHRpdGxlID0gIiIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgicGFyaWV0YWxfYW50cG9zdC5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKYGBgCgojIyMgRW50b3JoaW5hbCBzdXBlcmNsdXN0ZXIKYGBge3IsIGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9NC41fQoKU0NfZGF0YTwtc3Vic2V0KGRhdGFfc2NfNiwgc3VwZXJjbHVzdGVyPT02ICYgYXg9PSJhbnQiKQoKI3RpZmYoIn4vRG93bmxvYWRzL0VDXzEudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQuNSwgaGVpZ2h0PTQsIHJlcz0xMDAwKQpnZ3Bsb3QoU0NfZGF0YSwgYWVzKHk9YmV0YSwgeD1hZ2UpKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDYsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEyLCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOCwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjUsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fcG9pbnQoc2l6ZT0yLCBhbHBoYT0wLjcpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iIzI4ZmNmYyIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoImVudG9yaGluYWxfYW50X3lvdW5nZXIucG5nIiwgcGF0aD0ifi9Eb3dubG9hZHMiLCB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gNCkKCgoKClNDX2RhdGE8LXN1YnNldChkYXRhX3NjXzYsIHN1cGVyY2x1c3Rlcj09NiAmIGF4PT0icG9zdCIpCgojdGlmZigifi9Eb3dubG9hZHMvRUNfMi50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChTQ19kYXRhLCBhZXMoeT1iZXRhLCB4PWFnZSkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgbGV2ZWw9MC45NSwgY29sPSIjYmZmZmZmIikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoImVudG9yaGluYWxfcG9zdF95b3VuZ2VyLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgoKU0NfZGF0YTwtc3Vic2V0KGRhdGFfc2NfNiwgc3VwZXJjbHVzdGVyPT02KQoKI3RpZmYoIn4vRG93bmxvYWRzL0VDXzMudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQuNSwgaGVpZ2h0PTQsIHJlcz0xMDAwKQpnZ3Bsb3QoU0NfZGF0YSwgYWVzKHk9YmV0YSwgeD1hZ2UsIGdyb3VwPWF4LCBjb2xvcj1heCkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMjhmY2ZjIiwiI2JmZmZmZiIpKSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDIwKSkrCiAgZ3VpZGVzKHNoYXBlID0gRkFMU0UsIHNpemUgPSBGQUxTRSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMjYpLCBicmVha3M9c2VxKDAsMjYsNSkpKwogIGxhYnMoeSA9ICJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIsCiAgICAgICB4ID0gImFnZSAobW9udGhzKSIsCiAgICAgICB0aXRsZSA9ICIiKQojZGV2Lm9mZigpCiNnZ3NhdmUoImVudG9yaGluYWxfYW50cG9zdC5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKYGBgCgoKIyBBbmFseXNlcyB3aXRob3V0IHVzaW5nIGxlYXZlLW9uZS1vdXQgY3Jvc3MgdmFsaWRhdGlvbiAKCiMjIFBhcmFoaXBwb2NhbXBhbCBTdXBlcmNsdXN0ZXIgCkFzIHRoZSBwYXJhaGlwcG9jYW1wYWwgc3VwZXJjbHVzdGVyIHdhcyB0aGUgb25seSBvbmUgdGhhdCBkaWQgbm90IHNob3cgMTAwJSBjbHVzdGVyaW5nIGNvbnNpc3RlbmN5LCB3ZSBjYW5ub3QgZG8gc2VsZWN0aXZlIGF2ZXJhZ2luZyBoZXJlLiBTbyBqdXN0IHBsb3QgdGhlIHJhdyBkYXRhIHRvIHNlZSB3aGF0IGl0IGxvb2tzIGxpa2UuIFRoaXMgaXMgbm90IGNvcnJlY3RlZCBmb3Igc3ViamVjdC1sZXZlbCBiaWFzIGFzIHRoZSBvdGhlciBzdXBlcmNsdXN0ZXJzIGFyZS4gCgojIyMgTW9kZWxzIGFuZCBwbG90IApgYGB7ciwgZmlnLmhlaWdodD00LGZpZy53aWR0aD00LjV9CgojIyBkZWZpbmUgdGhlIHBhcmFoaXBwb2NhbXBhbCBzdXBlcmNsdXN0ZXIgCmRhdGFfU0M8LXN1YnNldChkYXRhX2FnX2hlbSwgc3VwZXJjbHVzdGVyPT0iNCIpIAoKIyMgbmV4dCBjb2xsYXBzZSBvdmVyIGNsdXN0ZXJzCmRhdGFfU0M8LWFnZ3JlZ2F0ZShkYXRhX1NDWywgImJldGEiXSwgYnk9KGxpc3QoZGF0YV9TQyRzdWJqLCBkYXRhX1NDJGF4LCBkYXRhX1NDJGJpbikpLCBtZWFuKQpjb2xuYW1lcyhkYXRhX1NDKTwtYygic3ViaiIsImF4IiwiYmluIiwiYmV0YSIpCgojIyBtYWtlIGEgZmFjdG9yIApkYXRhX1NDJGJpbjwtYXMuZmFjdG9yKGRhdGFfU0MkYmluKQoKIyMgbW9kZWwgaXQgCm1vZGVsPC1sbWUoYmV0YSB+IGF4KmJpbiwgcmFuZG9tPSB+MXxzdWJqLCBkYXRhPWRhdGFfU0MsIG5hLmFjdGlvbj1uYS5vbWl0LCB3ZWlnaHRzPXZhcklkZW50KGZvcm09fjF8YmluKSwgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSkKCiMjIG1vZGVsIGRpYWdub3N0aWNzIAojIGhpc3QocmVzaWR1YWxzKG1vZGVsKSkKIyBwbG90KG1vZGVsKQoKIyMgc3RhdHMKYW5vdmEobW9kZWwpIAoKIyMgcG9zdGhvY3MgCmVtbWVhbnMobW9kZWwsIGxpc3QocGFpcndpc2UgfiBheHxiaW4pLCBhZGp1c3QgPSAiZmRyIikKZW1tZWFucyhtb2RlbCwgbGlzdChwYWlyd2lzZSB+IGJpbnxheCksIGFkanVzdCA9ICJmZHIiKQoKIyMgc3VtbWFyaXplIGZvciBwbG90dGluZyAKc3RhdHM8LXN1bW1hcnlTRShkYXRhPWRhdGFfU0MsIG1lYXN1cmV2YXIgPSAiYmV0YSIsIGdyb3VwdmFycyA9IGMoImJpbiIsImF4IiksIG5hLnJtPVRSVUUpCnN0YXRzJHVwcGVyX3NlPC1zdGF0cyRiZXRhICsgc3RhdHMkc2UKc3RhdHMkbG93ZXJfc2U8LXN0YXRzJGJldGEgLSBzdGF0cyRzZQoKIyMgcGxvdCAKI3RpZmYoIn4vRG93bmxvYWRzL3Rlc3QudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQuNSwgaGVpZ2h0PTQsIHJlcz0xMDAwKQpnZ3Bsb3Qoc3RhdHMsIGFlcyh4PWJpbiwgeT1iZXRhLCBncm91cD1heCkpICsgCiAgZ2VvbV9saW5lKHNpemU9MSwgYWVzKGxpbmV0eXBlPSJzb2xpZCIsIGNvbG9yPWF4KSkgKwogIGdlb21fZXJyb3JiYXIod2lkdGggPSAuMCwgYWVzKHltaW49bG93ZXJfc2UsIHltYXg9dXBwZXJfc2UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTgpLAogIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNiwgZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSksIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoIjEiLCAiMiIsICIzIiwgIjQiKSwgbGFiZWxzPWMoIjAtNiIsICI3LTEyIiwgIjEzLTE4IiwiMTktMjUiKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygnI2Y1MjAwYycsJyNmYzkyODgnKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wKSsKICAjIGdndGl0bGUoInBhcmFoaXBwb2NhbXBhbAogICMgc3VwZXJjbHVzdGVyIikrCiAgbGFicyh4PSJhZ2UgKG1vbnRocykiLCB5PSJjb25uZWN0aXZpdHkiLCBjb2xvcj0iaGlwcG9jYW1wYWwgYXhpcyIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgicGFyYWhpcHBvY2FtcGFsLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgpgYGAKCiMjIyBMT0VTUyBjb250aW51b3VzIHBsb3RzIApgYGB7ciwgZmlnLmhlaWdodD00LGZpZy53aWR0aD00LjV9CgojIyBzdWJzZXQgCmRhdGFfU0M8LXN1YnNldChkYXRhX2FnX2hlbSwgc3VwZXJjbHVzdGVyPT0iNCIgJiBheCA9PSAiYW50IikgIyMgaXQncyBtYWRlIHVwIG9mIGNsdXN0ZXJzIDUgYW5kIDEwIAoKIyMgbmV4dCBjb2xsYXBzZSBvdmVyIGNsdXN0ZXJzCmRhdGFfU0M8LWFnZ3JlZ2F0ZShkYXRhX1NDWywgImJldGEiXSwgYnk9KGxpc3QoZGF0YV9TQyRzdWJqLCBkYXRhX1NDJGF4LCBkYXRhX1NDJGFnZSwgZGF0YV9TQyRzdXBlcmNsdXN0ZXIpKSwgbWVhbikKY29sbmFtZXMoZGF0YV9TQyk8LWMoInN1YmoiLCJheCIsICJhZ2UiLCAic3VwZXJjbHVzdGVyIiwiYmV0YSIpCgojIyBwbG90IAojdGlmZigifi9Eb3dubG9hZHMvUEhfMS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChkYXRhX1NDLCBhZXMoeT1iZXRhLCB4PWFnZSkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iI2Y1MjAwYyIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygyMCkpKwogIGd1aWRlcyhzaGFwZSA9IEZBTFNFLCBzaXplID0gRkFMU0UpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMC4zKSwgYnJlYWtzPXNlcSgwLDAuMywuMDUpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDI2KSwgYnJlYWtzPXNlcSgwLDI2LDUpKSsKICBsYWJzKHkgPSAiY29ubmVjdGl2aXR5IChGaXNoZXIgeikiLAogICAgICAgeCA9ICJhZ2UgKG1vbnRocykiLAogICAgICAgdGl0bGUgPSAiIikKIyNkZXYub2ZmKCkKI2dnc2F2ZSgicGFyYWhpcF9hbnRfeW91bmdlci5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKCgpkYXRhX1NDPC1zdWJzZXQoZGF0YV9hZ19oZW0sIHN1cGVyY2x1c3Rlcj09NCAmIGF4PT0icG9zdCIpCgojdGlmZigifi9Eb3dubG9hZHMvUEhfMi50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChkYXRhX1NDLCBhZXMoeT1iZXRhLCB4PWFnZSkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNSwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGxldmVsPTAuOTUsIGNvbD0iI2ZjOTI4OCIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygyMCkpKwogIGd1aWRlcyhzaGFwZSA9IEZBTFNFLCBzaXplID0gRkFMU0UpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMC4zKSwgYnJlYWtzPXNlcSgwLDAuMywuMDUpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDI2KSwgYnJlYWtzPXNlcSgwLDI2LDUpKSsKICBsYWJzKHkgPSAiY29ubmVjdGl2aXR5IChGaXNoZXIgeikiLAogICAgICAgeCA9ICJhZ2UgKG1vbnRocykiLAogICAgICAgdGl0bGUgPSAiIikKI2Rldi5vZmYoKQojZ2dzYXZlKCJwYXJhaGlwX3Bvc3RfeW91bmdlci5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0KQoKCgojIyMgYm90aCBwbG90cyBvdmVybGFpZCAKZGF0YV9TQzwtc3Vic2V0KGRhdGFfYWdfaGVtLCBzdXBlcmNsdXN0ZXI9PTQpCgojdGlmZigifi9Eb3dubG9hZHMvUEhfMy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NC41LCBoZWlnaHQ9NCwgcmVzPTEwMDApCmdncGxvdChkYXRhX1NDLCBhZXMoeT1iZXRhLCB4PWFnZSwgZ3JvdXA9YXgsIGNvbG9yPWF4KSkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMiwgY29sb3I9ImdyZXkiLCBsaW5ldHlwZT0ic29saWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTgsIGNvbG9yPSJncmV5IiwgbGluZXR5cGU9InNvbGlkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI1LCBjb2xvcj0iZ3JleSIsIGxpbmV0eXBlPSJzb2xpZCIpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgbGV2ZWw9MC45NSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNmNTIwMGMiLCIjZmM5Mjg4IikpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI0KSwgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0yMCksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdD0wLjUsIHNpemU9MjIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMjApKSsKICBndWlkZXMoc2hhcGUgPSBGQUxTRSwgc2l6ZSA9IEZBTFNFKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwyNiksIGJyZWFrcz1zZXEoMCwyNiw1KSkrCiAgbGFicyh5ID0gImNvbm5lY3Rpdml0eSAoRmlzaGVyIHopIiwKICAgICAgIHggPSAiYWdlIChtb250aHMpIiwKICAgICAgIHRpdGxlID0gIiIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgicGFyYWhpcF9hbnRwb3N0LnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQpCgpgYGAKCgojIENvbXBhcmUgaGlwcG9jYW1wYWwtc3VwZXJjbHVzdGVyIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIHRvZGRsZXJzIGFuZCBvbGRlciBjaGlsZHJlbgoKQ29tcGFyaW5nIGNvbm5lY3Rpdml0eSBvZiB0aGUgYW50ZXJpb3IgYW5kIHBvc3RlcmlvciBoaXBwb2NhbXB1cyB0byBlYWNoIHN1cGVyY2x1c3RlciwgYmV0d2VlbiB0aGUgb2xkZXN0IGFnZSBiaW4gd2l0aGluIHRoZSBpbmZhbnRpbGUgYW1uZXNpYSB3aW5kb3cgKH4xLjUtMiB5ZWFycyBvbGQpIGFuZCBjaGlsZHJlbiBqdXN0IG91dHNpZGUgb2YgaXQgKDMtNiB5ZWFycykKCiMjIFJlYWQgaW4gYW5kIHByZXBhcmUgdGhlIGRhdGEKYGBge3J9CiMjIHJlYWQgaW4gdGhlIGRhdGEsIENIQU5HRSBQQVRIUyBIRVJFIApkaXI8LSIvVXNlcnMvc2FtYW50aGFhdWRyYWluL0RvY3VtZW50cy9TY2llbmNlX1Byb2plY3RzL0JhYnlIaXBwb3MvUl9CYWJ5SGlwcG9zIgpkaXI8LSIvVXNlcnMvYXVkcmFpbnNwL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL09uZURyaXZlLU5hdGlvbmFsSW5zdGl0dXRlc29mSGVhbHRoL0JhYnlIaXBwb3MvUl9CYWJ5SGlwcG9zIgpkYXRhMiA8LSByZWFkLnRhYmxlKHBhc3RlKGRpciwgIi9zdXBlcmNsdXN0ZXJfYW50cG9zdF9iZXRhc19ieV9hZ2UudHh0Iiwgc2VwPSIiKSwgaGVhZGVyID0gVFJVRSkKZGF0YTI8LSBzdWJzZXQoZGF0YTIsIGFnZSA+IDM1KQpkYXRhMiRiaW48LSI1IgoKIyMgY2hhbmdlIHJvaSBsYWJlbCBmcm9tIGFudF9oaXBwbyB0byBhbnQgYW5kIHBvc3QgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGRhdGEgCmRhdGEyPC1tdXRhdGUoZGF0YTIsIGF4PSBjYXNlX3doZW4ocm9pPT0iYW50X2hpcHBvIiB+ICJhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9pPT0icG9zdF9oaXBwbyJ+ICJwb3N0IikpCgojIyBjb2xsYXBzZSBvdmVyIGhlbSBmb3IgZWFjaCBzdWJqIApkYXRhMl9hZ2c8LWFnZ3JlZ2F0ZShkYXRhMlssICJiZXRhIl0sIGJ5PShsaXN0KGRhdGEyJHN1YmosIGRhdGEyJGJpbiwgZGF0YTIkYWdlLCBkYXRhMiRheCwgZGF0YTIkc3VwZXJjbHVzdGVyKSksIG1lYW4pCmNvbG5hbWVzKGRhdGEyX2FnZyk8LWMoInN1YmoiLCJiaW4iLCJhZ2UiLCJheCIsInN1cGVyY2x1c3RlciIsImJldGEiKQoKIyMgcmVvcmRlciAKZGF0YTJfYWdnPC1hcy5kYXRhLmZyYW1lKGNiaW5kKGRhdGEyX2FnZyRzdWJqLCBkYXRhMl9hZ2ckYmluLCBkYXRhMl9hZ2ckYWdlLCBkYXRhMl9hZ2ckYXgsIGRhdGEyX2FnZyRiZXRhLCBkYXRhMl9hZ2ckc3VwZXJjbHVzdGVyKSkKY29sbmFtZXMoZGF0YTJfYWdnKTwtYygic3ViaiIsImJpbiIsImFnZSIsImF4IiwiYmV0YSIsInN1cGVyY2x1c3RlciIpCgojIyByZW1vdmUgcGFyYWhpcCBjbHVzdGVyIHdoaWNoIGRvZXNudCBoYXZlIExPTyBkYXRhIHRvIGNvbXBhcmUgdG8gCmRhdGEyX2FnZ19ub3NjNDwtc3Vic2V0KGRhdGEyX2FnZywgc3VwZXJjbHVzdGVyICE9IDQpCgojIyBjb21iaW5lIG9yaWdpbmFsIExPTyBkYXRhc2V0IHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgb2xkZXIga2lkcyAKZGF0YV9MT088LXJiaW5kKGRhdGFfU0NfYWxsLCBkYXRhMl9hZ2dfbm9zYzQpIAoKIyMgbWFrZSBhZ2UgbnVtZXJpYyBhbmQgc3Vic2V0IHRoZSBkYXRhIHRvIGJlIGp1c3QgdGhlIG9sZGVzdCBhZ2UgYmluIHdpdGhpbiBpbmZhbnRpbGUgYW1uZXNpYSB3aW5kb3cgKyB0aGUgb2xkZXIga2lkcyAKZGF0YV9MT08kYWdlPC1hcy5udW1lcmljKGRhdGFfTE9PJGFnZSkKZGF0YV9MT088LXN1YnNldChkYXRhX0xPTywgKChhZ2U+MTggJiBhZ2U8MjYpIHwgYWdlPjM1KSkKCiMjIHNwZWNpZnkgb3RoZXIgdmFyaWFibGVzIGFzIGZhY3RvcnMgb3IgbnVtZXJpYyAKZGF0YV9MT08kc3VwZXJjbHVzdGVyPC1hcy5mYWN0b3IoZGF0YV9MT08kc3VwZXJjbHVzdGVyKQpkYXRhX0xPTyRiZXRhIDwtIGFzLm51bWVyaWMoZGF0YV9MT08kYmV0YSkKCiMjIGNyZWF0ZSBsYWJlbHMgZm9yIGluc2lkZSBhbmQgb3V0c2lkZSBpbmZhbnRpbGUgYW1uZXNpYSB3aW5kb3cgCmRhdGFfTE9PPC1kYXRhX0xPTyAlPiUKICBtdXRhdGUoYW1uZXNpYT1jYXNlX3doZW4oYWdlPDI2IH4gImluc2lkZSIsCiAgICAgICAgICAgICAgICAgICAgICBhZ2U+MzUgfiAib3V0c2lkZSIpKQoKYGBgCgojIyBPbW5pYnVzIApgYGB7cn0KCiMjIG1vZGVsCm1vZGVsPC0gbG1lKChiZXRhKSB+IGF4KmFtbmVzaWEqc3VwZXJjbHVzdGVyLCByYW5kb209fnN1cGVyY2x1c3RlcnxzdWJqLCB3ZWlnaHRzPXZhcklkZW50KGZvcm09fjF8c3VwZXJjbHVzdGVyKSwgZGF0YT1kYXRhX0xPTywgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSwgbmEuYWN0aW9uPW5hLm9taXQpIAojIyBtb2RlbGVkIGhldGVyb3NrZWRhc3RpY2l0eSAKCiMjIG1vZGVsIGRpYWdub3N0aWNzIApoaXN0KHJlc2lkdWFscyhtb2RlbCkpCnBsb3QobW9kZWwpIAoKIyMgc3RhdHMKYW5vdmEobW9kZWwpCgojIyBwb3N0LWhvY3MgCmVtbWVhbnMobW9kZWwsIGxpc3QocGFpcndpc2UgfiBhbW5lc2lhIHwgc3VwZXJjbHVzdGVyKSwgYWRqdXN0ID0gImZkciIpCmVtbWVhbnMobW9kZWwsIGxpc3QocGFpcndpc2UgfiBheCpzdXBlcmNsdXN0ZXIpLCBhZGp1c3QgPSAiZmRyIikKCgpgYGAKCiMjIyBPdGhlciBtb2RlbHMgd2UgdHJpZWQgYW5kIGNvbXBhcmVkCgpUaGUgbW9kZWwgYWJvdmUgd2FzIHRoZSBiZXN0IGZpdCBhbmQgaGFkIHRoZSBiZXN0IGRpYWdub3N0aWNzLCB0aGVzZSB3ZXJlbid0IHVzZWQgaW4gdGhlIGVuZApgYGB7cn0KIyBhbm92YShtb2RlbDIsbW9kZWwpCiMgbW9kZWw8LWxtZSgoYmV0YSkgfiBheCphbW5lc2lhKnN1cGVyY2x1c3RlciwgcmFuZG9tPX5zdXBlcmNsdXN0ZXIqYW1uZXNpYXxzdWJqLCB3ZWlnaHRzPXZhcklkZW50KGZvcm09fjF8c3VwZXJjbHVzdGVyKSwgZGF0YT1kYXRhX2FnX2hlbSwgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSwgbmEuYWN0aW9uPW5hLm9taXQpICMjIGRvZXNudCBkbyBiZXR0ZXIgdGhhbiB2ZXJzaW9uIHdoZXJlIGp1c3QgaGF2ZSBzdXBlcmNsdXN0ZXIgcmFuZG9tIHNsb3BlLiBjYW50IGhhdmUgMyB3YXkgcmFuZG9tIHNsb3BlLiAKIyBtb2RlbDwtbG1lKGJldGEgfiBheCphbW5lc2lhKnN1cGVyY2x1c3RlciwgcmFuZG9tPX4xfHN1YmosIHdlaWdodHM9dmFySWRlbnQoZm9ybT1+MXxhbW5lc2lhKmF4KnN1cGVyY2x1c3RlciksIGRhdGE9ZGF0YV9hZ19oZW0sIGNvbnRyb2wgPSBsbWVDb250cm9sKG1zTWF4SXRlcj0xMDAwLCBtc01heEV2YWw9MTAwMCksIG5hLmFjdGlvbj1uYS5vbWl0KSAjIyBvcmlnaW5hbCBtb2RlbCwgaGV0ZXJvc2tlZGFzdGljIGFuZCBub25saW5lYXIgYW5kIG5vdCBub3JtYWwKIyBtb2RlbDwtbG1lKGJldGEgfiBheCphbW5lc2lhKnN1cGVyY2x1c3RlciwgcmFuZG9tPX4xfHN1YmosIHdlaWdodHM9dmFySWRlbnQoZm9ybT1+Zml0dGVkKC4pKSwgZGF0YT1kYXRhX2FnX2hlbSwgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSwgbmEuYWN0aW9uPW5hLm9taXQpICMjIG1vZGVscyB2YXJpYW5jZSBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBmaXR0ZWQgdmFsdWVzLCBkaWRudCBoZWxwIAojIG1vZGVsPC1sbWUoc3FydChiZXRhKzEpIH4gYXgqYW1uZXNpYSpzdXBlcmNsdXN0ZXIsIHJhbmRvbT1+MXxzdWJqLCBkYXRhPWRhdGFfYWdfaGVtLCBjb250cm9sID0gbG1lQ29udHJvbChtc01heEl0ZXI9MTAwMCwgbXNNYXhFdmFsPTEwMDApLCBuYS5hY3Rpb249bmEub21pdCkgIyMgc3F1cnQgdHJhbnNmb3JtIHRvIGhlbHAgd2l0aCBza2V3IGRpZG50IGhlbHAgCiMgbW9kZWw8LWxtZShsb2coYmV0YSsxKSB+IGF4KmFtbmVzaWEqc3VwZXJjbHVzdGVyLCByYW5kb209fjF8c3ViaiwgZGF0YT1kYXRhX2FnX2hlbSwgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSwgbmEuYWN0aW9uPW5hLm9taXQpICMjIyBsb2cgdG8gaGVscCB3aXRoIHNrZXcgZGlkbiB0aGVscCAKIyBtb2RlbDwtbG1lKGJldGEgfiBheCphbW5lc2lhKnN1cGVyY2x1c3RlciwgcmFuZG9tPX5zdXBlcmNsdXN0ZXJ8c3ViaiwgZGF0YT1kYXRhX2FnX2hlbSwgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSwgbmEuYWN0aW9uPW5hLm9taXQpICMjIHRoaXMgb25lIGhlbHBlZCwgYWRkaW5nIGEgcmFuZG9tIHNsb3BlIGZvciBzdXBlcmNsdXN0ZXIuIEJ1dCBzdGlsbCBzdXBlcmNsdXN0ZXIgYSBiaXQgaGV0ZXJvc2tlZGFzdGljLCB0cnkgYWRkaW5nIHdlaWdodHMgCgoKIyMjIGRpYWdub3N0aWNzIGNoZWNrZWQgCiMgIyMgcmVzaWR1YWxzIHNob3VsZCBiZSBub3JtYWxseSBkaXN0cmlidXRlZAojIGhpc3QocmVzaWR1YWxzKG1vZGVsKSkKIyAjI2NoZWNrIGZvciBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZQojIHBsb3QobW9kZWwpICNzaG91bGQgbG9vayBmYWlybHkgdW5pZm9ybSBhbmQgcmFuZG9tCiMgbGV2ZW5lVGVzdChyZXNpZHVhbHMobW9kZWwpIH4gZGF0YV9TQyRheCkKIyBsZXZlbmVUZXN0KHJlc2lkdWFscyhtb2RlbCkgfiBkYXRhX1NDJGFtbmVzaWEpCiMgc2hhcGlyby50ZXN0KHJlc2lkKG1vZGVsKSkKIyBpY2MobW9kZWwpCiMgIyMgQSBoaWdoIElDQyBzdWdnZXN0cyB0aGF0IHN1YmplY3RzIGFjY291bnQgZm9yIGEgbGFyZ2UgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZSBpbiBiZXRhLCBtZWFuaW5nIHN1YmplY3QtbGV2ZWwgdmFyaWF0aW9uIGlzIGltcG9ydGFudCB0byBtb2RlbCAocmFuZG9tIGludGVyY2VwdCBmb3Igc3ViamVjdCkuIElDQz4uMiBqdXN0aWZpZXMgdXNpbmcgYSByYW5kb20gaW50ZXJjZXB0LCBpZiBncmVhdGVyIHRoYW4gLjUgbW9zdCBvZiB0aGUgdmFyaWFuY2UgaXMgZHVlIHRvIHN1YmplY3QgZGlmZmVyZW5jZXMgYW5kIGEgbWl4ZWQgbW9kZWwgaXMgY3J1Y2lhbC4gSWYgSUNDIGlzIG1vZGVyYXRlIDAuMDUtLjIgYSByYW5kb20gaW50ZXJjZXB0IG1vZGVsIGlzIGZpbmUsIGlmIElDQyBpcyBncmVhdGVyIHRoYW4gLjIgc2hvdWxkIGNvbnNpZGVyIGFkZGlnbiByYW5kb20gc2xvcGVzIGlmIHN1c3BlY3QgZWZmZWN0IG9mIGZpeGVkIGVmZmVjdHMgdmFyaWVzIGJ5IHN1YmplY3QuIFdhbnQgdG8gdXNlIGFkanVzdGVkIElDQy4gCiMgQUlDKG1vZGVsLG1vZGVsMikgIyMgbG93ZXIsIG1vcmUgbmVnIGlzIGJldHRlciAKIyAjIyBjaGVjayB2YXJpYW5jZSBzdHJ1Y3R1cmUgb2YgZWFjaCBsZXZlbCBvZiBhbW5lc2lhIAojIHBsb3QoZml0dGVkKG1vZGVsKSwgcmVzaWQobW9kZWwpLCAKIyAgICAgIGNvbD1hcy5udW1lcmljKGFzLmZhY3RvcihkYXRhX1NDJGFtbmVzaWEpKSwgICMgQ29udmVydCBmYWN0b3IgdG8gbnVtZXJpYyBmb3IgY29sb3JzCiMgICAgICBwY2g9MTkpCiMgYWJsaW5lKGg9MCwgbHR5PTIpCiMgIyMgaWYgcmVzaWR1YWxzIGxvb2sgdW5lcXVhbCwgdmFyaWFuY2Ugc3RydWN0dXJlIGlzIG5lZWRlZAojIGJveHBsb3QocmVzaWQobW9kZWwpIH4gYW1uZXNpYSwgZGF0YT1kYXRhX1NDKQoKYGBgCgojIyAyIHdheSBpbnRlcmFjdGlvbnMgCmBgYHtyfQojIyBuZXh0IGJyZWFrIGRvd24gbW9kZWwgaW50byAyIHdheSBpbnRlcmFjdGlvbi4gaS5lLiBheCBieSBhbW5lc2lhIGZvciBlYWNoIHN1cGVyY2x1c3RlciAKIyMgdGhlc2UgbW9kZWxzIHdlcmUgdGhlIGJlc3QgZml0cyBhZnRlciBzb21lIG1vZGVsIGNvbXBhcmlzb25zIAoKZGF0YV9TQzwtc3Vic2V0KGRhdGFfTE9PLCBzdXBlcmNsdXN0ZXI9PSIxIikKbW9kZWw8LSBsbWUoKGJldGEpIH4gYXgqYW1uZXNpYSwgcmFuZG9tPX5hbW5lc2lhfHN1YmosICB3ZWlnaHRzPXZhcklkZW50KGZvcm09fjF8YXgpLCBkYXRhPWRhdGFfU0MsIGNvbnRyb2wgPSBsbWVDb250cm9sKG1zTWF4SXRlcj0xMDAwLCBtc01heEV2YWw9MTAwMCksIG5hLmFjdGlvbj1uYS5vbWl0KQphbm92YShtb2RlbCkKZW1tZWFucyhtb2RlbCwgbGlzdChwYWlyd2lzZSB+IGFtbmVzaWEqYXgpLCBhZGp1c3QgPSAiZmRyIikKCmRhdGFfU0M8LXN1YnNldChkYXRhX0xPTywgc3VwZXJjbHVzdGVyPT0iMiIpCm1vZGVsPC0gbG1lKChiZXRhKSB+IGF4KmFtbmVzaWEsIHJhbmRvbT1+YW1uZXNpYXxzdWJqLCAgd2VpZ2h0cz12YXJJZGVudChmb3JtPX4xfGF4KSwgZGF0YT1kYXRhX1NDLCBjb250cm9sID0gbG1lQ29udHJvbChtc01heEl0ZXI9MTAwMCwgbXNNYXhFdmFsPTEwMDApLCBuYS5hY3Rpb249bmEub21pdCkKYW5vdmEobW9kZWwpCmVtbWVhbnMobW9kZWwsIGxpc3QocGFpcndpc2UgfiBhbW5lc2lhKmF4KSwgYWRqdXN0ID0gImZkciIpCgpkYXRhX1NDPC1zdWJzZXQoZGF0YV9MT08sIHN1cGVyY2x1c3Rlcj09IjMiKQptb2RlbDwtIGxtZSgoYmV0YSkgfiBheCphbW5lc2lhLCByYW5kb209fmFtbmVzaWF8c3ViaiwgIHdlaWdodHM9dmFySWRlbnQoZm9ybT1+MXxheCksIGRhdGE9ZGF0YV9TQywgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSwgbmEuYWN0aW9uPW5hLm9taXQpCmFub3ZhKG1vZGVsKQplbW1lYW5zKG1vZGVsLCBsaXN0KHBhaXJ3aXNlIH4gYW1uZXNpYSpheCksIGFkanVzdCA9ICJmZHIiKQoKZGF0YV9TQzwtc3Vic2V0KGRhdGFfTE9PLCBzdXBlcmNsdXN0ZXI9PSI1IikKbW9kZWw8LSBsbWUoKGJldGEpIH4gYXgqYW1uZXNpYSwgcmFuZG9tPX5hbW5lc2lhfHN1YmosIHdlaWdodHM9dmFyQ29tYih2YXJJZGVudChmb3JtPX4xfGF4KSwgdmFyUG93ZXIoZm9ybT1+Zml0dGVkKC4pKSksIGRhdGE9ZGF0YV9TQywgY29udHJvbCA9IGxtZUNvbnRyb2wobXNNYXhJdGVyPTEwMDAsIG1zTWF4RXZhbD0xMDAwKSwgbmEuYWN0aW9uPW5hLm9taXQpCmFub3ZhKG1vZGVsKQplbW1lYW5zKG1vZGVsLCBsaXN0KHBhaXJ3aXNlIH4gYXgpLCBhZGp1c3QgPSAiZmRyIikKCmRhdGFfU0M8LXN1YnNldChkYXRhX0xPTywgc3VwZXJjbHVzdGVyPT0iNiIpCm1vZGVsPC0gbG1lKChiZXRhKSB+IGF4KmFtbmVzaWEsIHJhbmRvbT1+YW1uZXNpYXxzdWJqLCAgd2VpZ2h0cz12YXJJZGVudChmb3JtPX4xfGF4KSwgZGF0YT1kYXRhX1NDLCBjb250cm9sID0gbG1lQ29udHJvbChtc01heEl0ZXI9MTAwMCwgbXNNYXhFdmFsPTEwMDApLCBuYS5hY3Rpb249bmEub21pdCkKYW5vdmEobW9kZWwpCmVtbWVhbnMobW9kZWwsIGxpc3QocGFpcndpc2UgfiBhbW5lc2lhKmF4KSwgYWRqdXN0ID0gImZkciIpCgoKYGBgCgojIyBCYXIgUGxvdHMKIyMjIG1QRkMtU1RTIHN1cGVyY2x1c3RlciAKYGBge3IsIGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9NH0KCiMjIGRlZmluZSB0aGUgY2x1c3RlciAKZGF0YV9TQzwtc3Vic2V0KGRhdGFfTE9PLCBzdXBlcmNsdXN0ZXI9PSIzIikKCiMjIHN1bW1hcml6ZSBmb3IgcGxvdHRpbmcgCnN0YXRzPC1zdW1tYXJ5U0UoZGF0YT1kYXRhX1NDLCBtZWFzdXJldmFyID0gImJldGEiLCBncm91cHZhcnMgPSBjKCJhbW5lc2lhIiwiYXgiKSwgbmEucm09VFJVRSkKc3RhdHMkdXBwZXJfc2U8LXN0YXRzJGJldGEgKyBzdGF0cyRzZQpzdGF0cyRsb3dlcl9zZTwtc3RhdHMkYmV0YSAtIHN0YXRzJHNlCgojIyBwbG90CiN0aWZmKCJ+L0Rvd25sb2Fkcy93aW5kb3dzX1NUUy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NSwgaGVpZ2h0PTQuNSwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YW1uZXNpYSwgeT1iZXRhLCBmaWxsPWF4KSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoID0gMC44KSArIAogIGdlb21fZXJyb3JiYXIod2lkdGggPSAuMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjgpLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpKwogIGxhYnMoeD0iIiwgeT0iY29ubmVjdGl2aXR5IChGaXNoZXIgeikiKSArCnRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgbGFicyhmaWxsPSIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJyNmMmYyMDcnLCcjZmFmYWI0JyksIGxhYmVscyA9IGMoImFudGVyaW9yIiwgInBvc3RlcmlvciIpKSsgIyMjIG1QRkMtU1RTCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiaW5zaWRlIiwgIm91dHNpZGUiKSwgbGFiZWxzPWMoImluc2lkZSB3aW5kb3ciLCAib3V0c2lkZSB3aW5kb3ciKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wKSsKICBnZ3RpdGxlKCJ2bVBGQy1TVFMKICBzdXBlcmNsdXN0ZXIiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIsIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLCBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgidm1wZmNfc3RzLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQuNSkKCgoKCmBgYAoKIyMjIENpbmd1bG8tb3BlcmN1bGFyIHN1cGVyY2x1c3RlcgpgYGB7ciwgZmlnLmhlaWdodD00LGZpZy53aWR0aD00fQoKIyMgZGVmaW5lIHRoZSBjbHVzdGVyIApkYXRhX1NDPC1zdWJzZXQoZGF0YV9MT08sIHN1cGVyY2x1c3Rlcj09IjEiKQoKIyMgc3VtbWFyaXplIGZvciBwbG90dGluZyAKc3RhdHM8LXN1bW1hcnlTRShkYXRhPWRhdGFfU0MsIG1lYXN1cmV2YXIgPSAiYmV0YSIsIGdyb3VwdmFycyA9IGMoImFtbmVzaWEiLCJheCIpLCBuYS5ybT1UUlVFKQpzdGF0cyR1cHBlcl9zZTwtc3RhdHMkYmV0YSArIHN0YXRzJHNlCnN0YXRzJGxvd2VyX3NlPC1zdGF0cyRiZXRhIC0gc3RhdHMkc2UKCiMjIHBsb3QKI3RpZmYoIn4vRG93bmxvYWRzL3dpbmRvd3NfQ08udGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTUsIGhlaWdodD00LjUsIHJlcz0xMDAwKQpnZ3Bsb3Qoc3RhdHMsIGFlcyh4PWFtbmVzaWEsIHk9YmV0YSwgZmlsbD1heCkpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLCB3aWR0aCA9IDAuOCkgKyAKICBnZW9tX2Vycm9yYmFyKHdpZHRoID0gLjAsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC44KSwgYWVzKHltaW49bG93ZXJfc2UsIHltYXg9dXBwZXJfc2UpKSsKICBsYWJzKHg9IiIsIHk9ImNvbm5lY3Rpdml0eSIpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLCAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSwgc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGxhYnMoZmlsbD0iIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCcjMTUyMzcwJywnIzY1NzdhMScpLCBsYWJlbHMgPSBjKCJhbnRlcmlvciIsICJwb3N0ZXJpb3IiKSkrIAogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoImluc2lkZSIsICJvdXRzaWRlIiksIGxhYmVscz1jKCJpbnNpZGUgd2luZG93IiwgIm91dHNpZGUgd2luZG93IikpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBsaW1pdHMgPSBjKDAsMC4zKSwgYnJlYWtzPXNlcSgwLDAuMywuMDUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCkrCiAgZ2d0aXRsZSgiY2luZ3Vsby1vcGVyY3VsYXIKICBzdXBlcmNsdXN0ZXIiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIsIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLCBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgiY2luZ3Vsby1vcGVyYy5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0LjUpCgpgYGAKCiMjIyBEb3JzYWwgZnJvbnRhbCBwYXJpZXRhbCBzdXBlcmNsdXN0ZXIKYGBge3IsIGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9NH0KCiMjIGRlZmluZSB0aGUgY2x1c3RlciAKZGF0YV9TQzwtc3Vic2V0KGRhdGFfTE9PLCBzdXBlcmNsdXN0ZXI9PSIyIikKCiMjIHN1bW1hcml6ZSBmb3IgcGxvdHRpbmcgCnN0YXRzPC1zdW1tYXJ5U0UoZGF0YT1kYXRhX1NDLCBtZWFzdXJldmFyID0gImJldGEiLCBncm91cHZhcnMgPSBjKCJhbW5lc2lhIiwiYXgiKSwgbmEucm09VFJVRSkKc3RhdHMkdXBwZXJfc2U8LXN0YXRzJGJldGEgKyBzdGF0cyRzZQpzdGF0cyRsb3dlcl9zZTwtc3RhdHMkYmV0YSAtIHN0YXRzJHNlCgojIyBwbG90CiN0aWZmKCJ+L0Rvd25sb2Fkcy93aW5kb3dzX2RGUC50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NSwgaGVpZ2h0PTQuNSwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YW1uZXNpYSwgeT1iZXRhLCBmaWxsPWF4KSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoID0gMC44KSArIAogIGdlb21fZXJyb3JiYXIod2lkdGggPSAuMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjgpLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpKwogIGxhYnMoeD0iIiwgeT0iY29ubmVjdGl2aXR5IChGaXNoZXIgeikiKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI0KSwgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xOCksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdD0wLjUsIHNpemU9MjIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBsYWJzKGZpbGw9IiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygnIzRiZjUyYScsJyNhMmY3OTInKSwgbGFiZWxzID0gYygiYW50ZXJpb3IiLCAicG9zdGVyaW9yIikpKyAKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCJpbnNpZGUiLCAib3V0c2lkZSIpLCBsYWJlbHM9YygiaW5zaWRlIHdpbmRvdyIsICJvdXRzaWRlIHdpbmRvdyIpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTApKwogIGdndGl0bGUoImRvcnNhbCBmcm9udGFsIHBhcmlldGFsCiAgc3VwZXJjbHVzdGVyIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyLCBmYWNlPSJib2xkIiwgaGp1c3Q9MC41KSwgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQojZGV2Lm9mZigpCiNnZ3NhdmUoImRvcnNhbEZQTi5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0LjUpCgpgYGAKCgoKIyMjIEVudG9yaGluYWwgc3VwZXJjbHVzdGVyCmBgYHtyLCBmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTR9CgojIyBkZWZpbmUgdGhlIGNsdXN0ZXIgCmRhdGFfU0M8LXN1YnNldChkYXRhX0xPTywgc3VwZXJjbHVzdGVyPT0iNiIpCgojIyBzdW1tYXJpemUgZm9yIHBsb3R0aW5nIApzdGF0czwtc3VtbWFyeVNFKGRhdGE9ZGF0YV9TQywgbWVhc3VyZXZhciA9ICJiZXRhIiwgZ3JvdXB2YXJzID0gYygiYW1uZXNpYSIsImF4IiksIG5hLnJtPVRSVUUpCnN0YXRzJHVwcGVyX3NlPC1zdGF0cyRiZXRhICsgc3RhdHMkc2UKc3RhdHMkbG93ZXJfc2U8LXN0YXRzJGJldGEgLSBzdGF0cyRzZQoKIyMgcGxvdAojdGlmZigifi9Eb3dubG9hZHMvd2luZG93c19FQy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NSwgaGVpZ2h0PTQuNSwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YW1uZXNpYSwgeT1iZXRhLCBmaWxsPWF4KSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoID0gMC44KSArIAogIGdlb21fZXJyb3JiYXIod2lkdGggPSAuMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjgpLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpKwogIGxhYnMoeD0iIiwgeT0iY29ubmVjdGl2aXR5IChGaXNoZXIgeikiKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI0KSwgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xOCksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdD0wLjUsIHNpemU9MjIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBsYWJzKGZpbGw9IiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygnIzI4ZmNmYycsJyNiZmZmZmYnKSwgbGFiZWxzID0gYygiYW50ZXJpb3IiLCAicG9zdGVyaW9yIikpKyAKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCJpbnNpZGUiLCAib3V0c2lkZSIpLCBsYWJlbHM9YygiaW5zaWRlIHdpbmRvdyIsICJvdXRzaWRlIHdpbmRvdyIpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTApKwogIGdndGl0bGUoImVudG9yaGluYWwKICBzdXBlcmNsdXN0ZXIiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIsIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLCBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgiZW50b3JoaW5hbC5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0LjUpCgpgYGAKCiMjIyBNZWRpYWwgcGFyaWV0YWwgc3VwZXJjbHVzdGVyCmBgYHtyLCBmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTR9CgojIyBkZWZpbmUgdGhlIGNsdXN0ZXIgCmRhdGFfU0M8LXN1YnNldChkYXRhX0xPTywgc3VwZXJjbHVzdGVyPT0iNSIpCgojIyBzdW1tYXJpemUgZm9yIHBsb3R0aW5nIApzdGF0czwtc3VtbWFyeVNFKGRhdGE9ZGF0YV9TQywgbWVhc3VyZXZhciA9ICJiZXRhIiwgZ3JvdXB2YXJzID0gYygiYW1uZXNpYSIsImF4IiksIG5hLnJtPVRSVUUpCnN0YXRzJHVwcGVyX3NlPC1zdGF0cyRiZXRhICsgc3RhdHMkc2UKc3RhdHMkbG93ZXJfc2U8LXN0YXRzJGJldGEgLSBzdGF0cyRzZQoKIyMgcGxvdAojdGlmZigifi9Eb3dubG9hZHMvd2luZG93c19wYXJpZXRhbC50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NSwgaGVpZ2h0PTQuNSwgcmVzPTEwMDApCmdncGxvdChzdGF0cywgYWVzKHg9YW1uZXNpYSwgeT1iZXRhLCBmaWxsPWF4KSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoID0gMC44KSArIAogIGdlb21fZXJyb3JiYXIod2lkdGggPSAuMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjgpLCBhZXMoeW1pbj1sb3dlcl9zZSwgeW1heD11cHBlcl9zZSkpKwogIGxhYnMoeD0iIiwgeT0iY29ubmVjdGl2aXR5IikgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgbGFicyhmaWxsPSIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJyNmYTc1MGYnLCcjZmFhNjY2JyksIGxhYmVscyA9IGMoImFudGVyaW9yIiwgInBvc3RlcmlvciIpKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCJpbnNpZGUiLCAib3V0c2lkZSIpLCBsYWJlbHM9YygiaW5zaWRlIHdpbmRvdyIsICJvdXRzaWRlIHdpbmRvdyIpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLDAuMyksIGJyZWFrcz1zZXEoMCwwLjMsLjA1KSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTApKwogIGdndGl0bGUoIm1lZGlhbCBwYXJpZXRhbAogIHN1cGVyY2x1c3RlciIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiwgZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSksIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikKI2Rldi5vZmYoKQojZ2dzYXZlKCJtZWRpYWxwYXJpZXRhbC5wbmciLCBwYXRoPSJ+L0Rvd25sb2FkcyIsIHdpZHRoID0gNC41LCBoZWlnaHQgPSA0LjUpCgpgYGAKCgojIyMgUGFyYWhpcHBvY2FtcGFsIHN1cGVyY2x1c3RlcgoKVGhpcyBjbHVzdGVyIGlzIG5vdCBwYXJ0IG9mIExPTyBhbmFseXNpcyBzbyBydW5uaW5nIHN0YXRzIGFuZCBwbG90IHNlcGFyYXRlbHkgCmBgYHtyLCBmaWcuaGVpZ2h0PTQuNSxmaWcud2lkdGg9NX0KCiMjIHJlYWQgaW4gdGhlIGRhdGEsIENIQU5HRSBUTyBZT1VSIFBBVEggCmRpcjwtIi9Vc2Vycy9hdWRyYWluc3AvTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtTmF0aW9uYWxJbnN0aXR1dGVzb2ZIZWFsdGgvQmFieUhpcHBvcy9SX0JhYnlIaXBwb3MiCmRhdGEgPC0gcmVhZC50YWJsZShwYXN0ZShkaXIsICIvc3VwZXJjbHVzdGVyX2FudHBvc3RfYmV0YXNfYnlfYWdlLnR4dCIsIHNlcD0iIiksIGhlYWRlciA9IFRSVUUpCgojIyBnZXQgY29ycmVjdCBhZ2UgcmFuZ2UgCmRhdGE8LXN1YnNldChkYXRhLCAoKGFnZT4xOCAmIGFnZTwyNikgfCBhZ2U+MzUpKQoKIyMgY29sbGFwc2Ugb3ZlciBoZW0KZGF0YV9hZ19oZW08LWFnZ3JlZ2F0ZShkYXRhWywgImJldGEiXSwgYnk9KGxpc3QoZGF0YSRzdWJqLCBkYXRhJHJvaSwgZGF0YSRhZ2UsIGRhdGEkc3VwZXJjbHVzdGVyKSksIG1lYW4pCmNvbG5hbWVzKGRhdGFfYWdfaGVtKTwtYygic3ViaiIsImF4IiwiYWdlIiwic3VwZXJjbHVzdGVyIiwiYmV0YSIpCgojIyBkZWZpbmUgc3VwZXJjbHVzdGVyCmRhdGFfU0M8LXN1YnNldChkYXRhX2FnX2hlbSwgc3VwZXJjbHVzdGVyPT0iNCIpCgojIyBjcmVhdGUgbGFibGUgZm9yIGluc2lkZSBhbmQgb3V0c2lkZSBpbmZhbnRpbGUgYW1uZXNpYSB3aW5kb3cgCmRhdGFfU0M8LWRhdGFfU0MgJT4lCiAgbXV0YXRlKGFtbmVzaWE9Y2FzZV93aGVuKGFnZTwyNiB+ICJpbnNpZGUiLAogICAgICAgICAgICAgICAgICAgICAgYWdlPjM1IH4gIm91dHNpZGUiKSkKCiMjIG1vZGVsIAptb2RlbDwtIGxtZSgoYmV0YSkgfiBheCphbW5lc2lhLCByYW5kb209fmFtbmVzaWF8c3ViaiwgIHdlaWdodHM9dmFyQ29tYih2YXJJZGVudChmb3JtPX4xfGFtbmVzaWEpLCB2YXJQb3dlcihmb3JtPX5maXR0ZWQoLikpKSwgZGF0YT1kYXRhX1NDLCBjb250cm9sID0gbG1lQ29udHJvbChtc01heEl0ZXI9MTAwMCwgbXNNYXhFdmFsPTEwMDApLCBuYS5hY3Rpb249bmEub21pdCkKCiMjIGRpYWdub3N0aWNzIAojIGhpc3QocmVzaWR1YWxzKG1vZGVsKSkKIyAjI2NoZWNrIGZvciBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZQojIHBsb3QobW9kZWwpICNzaG91bGQgbG9vayBmYWlybHkgdW5pZm9ybSBhbmQgcmFuZG9tCiMgcXFub3JtKHJlc2lkKG1vZGVsKSkKIyBxcWxpbmUocmVzaWQobW9kZWwpKQojIGljYyhtb2RlbCkKCiMjIHN0YXRzIAphbm92YShtb2RlbCkKCiMjIHBvc3Rob2NzIAplbW1lYW5zKG1vZGVsLCBsaXN0KHBhaXJ3aXNlIH4gYW1uZXNpYSpheCksIGFkanVzdCA9ICJmZHIiKQplbW1lYW5zKG1vZGVsLCBsaXN0KHBhaXJ3aXNlIH4gYW1uZXNpYSksIGFkanVzdCA9ICJmZHIiKQoKIyMgZm9ybWF0IGZvciBwbG90dGluZyAKc3RhdHM8LXN1bW1hcnlTRShkYXRhPWRhdGFfU0MsIG1lYXN1cmV2YXIgPSAiYmV0YSIsIGdyb3VwdmFycyA9IGMoImFtbmVzaWEiLCJheCIpLCBuYS5ybT1UUlVFKQpzdGF0cyR1cHBlcl9zZTwtc3RhdHMkYmV0YSArIHN0YXRzJHNlCnN0YXRzJGxvd2VyX3NlPC1zdGF0cyRiZXRhIC0gc3RhdHMkc2UKCiMjIHBsb3QgCiN0aWZmKCJ+L0Rvd25sb2Fkcy93aW5kb3dzX1BILnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD01LCBoZWlnaHQ9NC41LCByZXM9MTAwMCkKZ2dwbG90KHN0YXRzLCBhZXMoeD1hbW5lc2lhLCB5PWJldGEsIGZpbGw9YXgpKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgd2lkdGggPSAwLjgpICsgCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IC4wLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOCksIGFlcyh5bWluPWxvd2VyX3NlLCB5bWF4PXVwcGVyX3NlKSkrCiAgbGFicyh4PSIiLCB5PSJjb25uZWN0aXZpdHkgKEZpc2hlciB6KSIpICsKIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3Q9MC41LCBzaXplPTIyKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgbGFicyhmaWxsPSIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJyNmNTIwMGMnLCcjZmM5Mjg4JyksIGxhYmVscyA9IGMoImFudGVyaW9yIiwgInBvc3RlcmlvciIpKSsgCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiaW5zaWRlIiwgIm91dHNpZGUiKSwgbGFiZWxzPWMoImluc2lkZSB3aW5kb3ciLCAib3V0c2lkZSB3aW5kb3ciKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IGMoMCwwLjMpLCBicmVha3M9c2VxKDAsMC4zLC4wNSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wKSsKICBnZ3RpdGxlKCJwYXJhaGlwcG9jYW1wYWwKICBzdXBlcmNsdXN0ZXIiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIsIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLCBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCiNkZXYub2ZmKCkKI2dnc2F2ZSgicGFyYWhpcHBvY2FtcGFsLnBuZyIsIHBhdGg9In4vRG93bmxvYWRzIiwgd2lkdGggPSA0LjUsIGhlaWdodCA9IDQuNSkKCmBgYAoKCgoKCgoKCgoKCgoKCgoKCg==